Handler机制原理

andriod提供了Handler 和 Looper 来知足线程间的通讯。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。

1)Looper: 一个线程能够产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。 
2)Handler: 你能够构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。 oop

4)线程: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中。io

 

3.Handler处理消息thread

UI主线程经过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,经过消息的参数判断该消息对应的Handler,而后将消息分发到指定的Handler进行处理。垃圾回收

子线程经过Handler、Looper与UI主线程通讯的流程如图所示。循环

相关文章
相关标签/搜索