安卓网络编程1--ANR异常和Handler机制

来源:互联网 发布:java内存溢出原因 编辑:程序博客网 时间:2024/05/29 16:44

安卓网络编程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、重写handlerhandlemessage方法,注意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.4handleMessage方法收到消息后就会执行,在这个方法里面更新ui

注意:

1、只要有更新UI的操作都必须用handler机制,

2、子线程一般处理耗时等操作,而不能处理更新UI的操作,

3、主线程一般处理更新UI的操作,而不能处理耗时的操作。

二、Handler消息机制

同类参考文章:http://blog.csdn.net/lmj623565791/article/details/38377229

一个安卓应用启动时,会在主线程中会同时启动一个MessageQueue消息队列和一个Looper循环器,来接收消息和检测消息,当子线程向主线程发送消息时sendMessage,该消息会被加入到主线程的消息队列中,当Looper循环器遍历到该消息时,就会把该消息传递给HandleHandle就用调用自己的handler.message()方法来处理消息,执行更新UI的操作。如下图所示。


Handler的作用是用来发送消息和处理消息

MessageQueue的作用主要是用来接收消息,

Looper的作用是用来监视消息,取出消息

0 0