您的位置:首页
handler机制的原理
2016-03-24 23:02
169 查看
handler机制的原理
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。Handler
Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
Message Queue(消息队列):用来存放线程放入的消息。
线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
1.Handler创建消息
每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如图所示。
2.Handler发送消息
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。
Handler、Looper、MessageQueue的初始化流程如图所示:
Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。
3.Handler处理消息
UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。
子线程通过Handler、Looper与UI主线程通信的流程如图所示。
相关文章推荐
- Linux基础--网络管理
- Python,实现全排列的打印
- Android 自定义控件之第一讲:attr format 取值类型
- Java 栈和队列
- Integer源代码
- 1012.数字分类(20) PAT
- <c:forEach>标签的使用
- 万能适配器----结合知识点CheckBox一起使用
- 【shell编程基础2】shell组合应用之一:重定向和逻辑
- JVM-类文件结构
- leetcode Palindrome Number 009
- 安装cvxpy时解决ImportError: No module named multiprocessing
- iOS 25个性能优化/内存优化常用方法
- The method onClick(View) of type MainActivity must override or implement a supertype method
- JDBC学习笔记(五):模拟银行转账
- XP下vs2008-qt4.8.6编译Qgis:QwtPolar编译
- java多线程编程
- hdu5592/BestCoder Round #65 树状数组寻找第K大
- CMake一步步入门
- 15教育技术冯志超