安卓网络编程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、重写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的作用是用来监视消息,取出消息。
- 安卓网络编程1--ANR异常和Handler机制
- Handler机制 与 ANR异常
- 王学岗ANR异常以、handler机制及其源码详解
- 安卓Handler机制
- 安卓网络Httpuilconnection和handler助手
- 安卓基础4:网络编程1_消息机制和图片处理
- 安卓多线程编程系列3:使用handler和message下载网络图片
- 安卓Handler消息机制
- 安卓之handler机制
- 网络访问和handler机制
- 安卓捕获RuntimeException,ANR,Native信号异常
- 网络编程之Handler消息机制
- 耗时操作ANR和handler
- Activity启动模式、ANR异常、Handler
- 安卓之ANR
- 安卓handler消息处理机制
- 安卓Handler消息机制的例子
- 安卓基础:Handler消息传送机制
- 常用Maven的仓库地址
- BFS 模板
- HDU 1406 (完数)
- 【算法】任意区间寻找约数最大的数
- 数据库部分知识点
- 安卓网络编程1--ANR异常和Handler机制
- 41.Oracle数据库SQL开发之 日期和时间的存储与处理——设置默认的日期格式
- XX科技继续11-08
- Bootstrap按钮
- 42.Oracle数据库SQL开发之 日期和时间的存储与处理——Oracle对2位年份处理
- maven之简单运行命令
- 测试的自我消灭
- 【算法】集合众数和重数
- 即将步入程序世界的小菜鸟