异步消息处理机制 Handler Looper Message
2016-03-17 19:25
267 查看
说明: 异步消息处理机制是由于在UI线程不能发生阻塞,所以把耗费时间的操作放到子线程处理,但是处理完成后,需要主线程进行相关操作(更新UI),所以有了异步消息处理机制,android三种实现异步消息处理机制最后都是由 Handler Looper Message这个组合处理(MessageQueue这个再Looper类初始化)。
首先列出三种异步消息处理的代码
定义一个Handler,在onCreate()方法内或者局部变量都可以
1、handler post(Runnable r)
1、每个线程有且最多有一个Looper对象,主线程启动默认初始化Looper对象(ActivityThread)
2、loop()方法,不断从MessageQueue中去取消息,交给消息的target属性的dispatchMessage去处理
3、子线程如果new 一个handler,需要初始化Looper(Looper.prepare()),并且后面执行(Looper.loop),handler初始化 时会判断是否有Looper对象,如果为空,则抛出异常
4、Looper.prepare()方法内有判断Looper对象是否为空,如果不为null,则抛出异常 Looper对象存储在ThreadLoacal对象内
备注:ThreadLocal和synchronized都是同步代码,ThreadLocal可以在一个线程中存储变量
5、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
6、hanlder内的handlerMessage()是回调函数
建议根据源代码分析查看对应的关系
两个文章结合看:http://blog.csdn.net/lmj623565791/article/details/38377229 http://blog.csdn.net/guolin_blog/article/details/9991569
子线程定义异步处理
首先列出三种异步消息处理的代码
定义一个Handler,在onCreate()方法内或者局部变量都可以
Handler handler = new Handler(){ @Override <span style="color:#ff0000;"> //handler异步消息处理回调方法</span> public void handleMessage(Message msg) { super.handleMessage(msg); } };
1、handler post(Runnable r)
new Thread(new Runnable() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { <span style="color:#ff0000;">//在UI线程运行的代码</span> } }); } } ).start();2、 runOnuiThread
new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { //<span style="color: rgb(255, 0, 0); font-family: Arial, Helvetica, sans-serif;">在UI线程运行的代码</span> } }); } } ).start();3、handler发送消息
new Thread(new Runnable() { @Override public void run() { Message message = handler.obtainMessage(); handler.sendEmptyMessage(0); <span style="color:#ff0000;">//发送消息后,在回调函数handlerMessage()方法内调用</span> } } ).start();
备注:上面三个方法最后都是通过handler处理异步信息
Handler Looper Message 机制主要内容如下:1、每个线程有且最多有一个Looper对象,主线程启动默认初始化Looper对象(ActivityThread)
2、loop()方法,不断从MessageQueue中去取消息,交给消息的target属性的dispatchMessage去处理
3、子线程如果new 一个handler,需要初始化Looper(Looper.prepare()),并且后面执行(Looper.loop),handler初始化 时会判断是否有Looper对象,如果为空,则抛出异常
4、Looper.prepare()方法内有判断Looper对象是否为空,如果不为null,则抛出异常 Looper对象存储在ThreadLoacal对象内
备注:ThreadLocal和synchronized都是同步代码,ThreadLocal可以在一个线程中存储变量
5、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
6、hanlder内的handlerMessage()是回调函数
建议根据源代码分析查看对应的关系
两个文章结合看:http://blog.csdn.net/lmj623565791/article/details/38377229 http://blog.csdn.net/guolin_blog/article/details/9991569
子线程定义异步处理
new Thread(new Runnable() { private Handler handler; @Override public void run() { Log.e("xiaoma", "aabbbbbaaaa"); Looper.prepare(); handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.e("xiaoma","aaaaaaaaaaa"); } }; handler.sendEmptyMessage(0); Looper.loop(); } } ).start();
相关文章推荐
- Linux Recover MYSQL Password
- Linux下软链接与硬链接的区别
- Linux查看物理CPU个数、核数、逻辑CPU个数
- Makefile 学习日记(五)——makefile中的函数
- centos7安装docker
- Tomcat 的热部署和加载
- linux基础正则表达式
- nginx 配置301转发
- Linux创建分区开机自动挂载
- 《Linux内核与分析》第四周
- [BZOJ1233] [Usaco2009Open]干草堆tower
- Linux学习笔记--find命令(文件搜索命令)
- Apache优化:修改最大并发连接数
- Apache优化:修改最大并发连接数
- 《Linux操作系统分析》之使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 初识apache commons-pool 2.x
- 关于AVPlayer pop时崩溃的问题
- CentOS下的Mysql自动备份
- android selinux权限, Permission denied, 访问限制
- Linux 基础命令3