安卓网络编程1--ANR异常和Handler机制
一、ANR异常
1、ANR :Application not response 应用无响应,如下:
ANR的原因:在主线程中做了耗时的操作,比如访问网络、拷贝大数据等
ANR解决办法:将所有的耗时操作(联网、拷贝大数据、下载等耗时的操作)都放到子线程中,避免在UI线程中执行耗时操作。
注意:
[1]、只要不是在new thread(){run();}.start();【或者Runnable接口的run方法】内执行的线程都是在主线程中执行的
[2]、java中创建线程有2中方式:1继承Thread类,2实现Runnable接口
[3]、只有主线程才可以更新ui,子线程只能向主线程发送消息,然后在主线程中更新UI。这是谷歌的规定,是为了避免线程的同步与互斥问题。
2、在子线程中用handler向主线程发消息,然后在主线程中更新UI。
3、消息机制的写法
3.1、在主线程创建一个handler对象
private Handler handler = new Handler();
3.2、重写handler的handlemessage方法,注意Handler类中handleMessage()方法是一个空方法,需要重写。
public void handleMessage(android.os.Message msg) {更新UI}
3.3、在子线程中用在主线程创建的handler对象(助手)发消息
Message msg = new Message();
handler.sendMessage(msg);
//该消息会保存到主线程中的消息队列中【Messagequeue】,由循环器【Looper】不停的监视消息队列,取出消息队列中的消息交给【Handler】的handleMessage方法处理。
3.4、handleMessage方法收到消息后就会执行,在这个方法里面更新ui。
注意:
1、只要有更新UI的操作都必须用handler机制,
2、子线程一般处理耗时等操作,而不能处理更新UI的操作,
3、主线程一般处理更新UI的操作,而不能处理耗时的操作。
二、Handler消息机制
同类参考文章:http://blog.csdn.net/lmj623565791/article/details/38377229
一个安卓应用启动时,会在主线程中会同时启动一个MessageQueue消息队列和一个Looper循环器,来接收消息和检测消息,当子线程向主线程发送消息时sendMessage,该消息会被加入到主线程的消息队列中,当Looper循环器遍历到该消息时,就会把该消息传递给Handle,Handle就用调用自己的handler.message()方法来处理消息,执行更新UI的操作。如下图所示。
Handler的作用是用来发送消息和处理消息,
MessageQueue的作用主要是用来接收消息,
Looper的作用是用来监视消息,取出消息。