【 Android应用开发-网络编程①】
1、ANR(Application Not Response)应用程序无响应
①当用户输入事件5s内没有得到响应,将会弹出ANR对话框;
②广播接收者的onReceive()方法执行时间超过10s会出现ANR;
③解决原则:所有耗时操作都要在子线程中进行,包括网络操作、I/O、SDCard、数据运算;
2、常见错误及解决:
①ANR:application not response 应用无响应; androoid中耗时的操作(请求网络,大文件的拷贝,数据库的操作)需要在子线程中做。
09-02 01:52:40.711:E/ActivityManager(857): ANR in com.zdc.sourcelook(com.zdc.sourcelook/.MainActivity)
②4.0后网络操作强制在子线程中进行。因为网络访问是耗时的操作,可能会导致ANR
09-02 01:57:32.879: W/System.err(1789): android.os.NetworkOnMainThreadException
③错误线程调用异常,子线程不能够更新UI(控件的内容)
09-02 02:02:08.873: W/System.err(1858): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
④主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做。子线程不能更新控件的内容(更新Ui)。所以产生了矛盾,解决办法就是使用Handler.
3、Handler的使用步骤:
①主线程中创建一个Handler
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
};
};
②重写handler的handlermessage方法
③子线程中创建一个Message对象,将获取的数据绑定给msg
通过指定URL获取有效数据,并解析获取的流数据
InputStream inputStream = connection.getInputStream();
// 将一个读取流转换成一个图片(Drawable、Btimap):
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
Message msg = new Message();
//另一种方式:Message msg = Messge.obtain;
msg.obj = result;
④主线程中的handler对象在子线程中将message发送给主线程
handler.sendMessage(msg);
⑤主线程中handlermessage方法接受子线程发来的数据,就可以做更新UI的操作。
4、注意:子线程一定不能更新UI?
①SurfaceView :多媒体视频播放,可以在子线程中更新UI;
②Progress(进度)相关的控件:也是可以在子线程中更新Ui;