Handler机制

Handler线程安全




在子线程中用Handler需要调用Looper.prepare()方法才能运行正常。


·Handler的源码分析
Handler的消息处理主要有五个部分组成
1.Message:是在线程之间传递的消息,可以携带少量的数据,用于线程之间交换数据,
 Message有四个常用的字段,What字段,arg1字段,arg2字段,obj字段。what,arg1,arg2可以携带整型数据。obj可以  object对象。


2.Handler: 主要用于放松过消息和处理消息的。发送消息一般使用sendMessage()方法,还有其他的一系列send×××方法,但最终都是
  调用了sendMessageAtTime()方法,除了sendMessageAtFrontfQueue()这个方法。


3.Message Queue: MessageQueue是消息队列的意思,主要用于存放所有通过Handler发送的消息,这部分的消息会一直存在于消息队列
中,等待被处理,每个线程只会有一个MessageQueue对象。


4.Loopre:  每个线程通过Handler发送的消息都保存在MessaeQueue中,Looper通过loop()的方法,就会进入到一个无限循环中,
  每当发现MessageQueue中存在一条消息就会将它取出,并传递到Hanler的handeMessage()方法中,每个线程只会有一个     Loopre对象。


5.ThreadLocal: MessageQueue对象,和Looper对象在每个线程中都只会有一个对象,怎么能保证它只有一个对象,就通过ThreadLocal来       保存。Thread Local是一个线程内部的数据存储类,通过它可以在指定线程中存储数据,数据存储以后,只有在指定线       程中可以获取到存储到数据,对于其他线程来说则无法获取到数据。


在主线程使用Handler的过程:


首先在主线程创建一个Handler对象 ,并重写handleMessage()方法。然后当在子线程中需要进行更新UI的操作,我们就创建一个Message对象, 并通过handler发送这条消息出去。之后这条消息被加入到MessageQueue队列中等待被处理,通过Looper对象会一直尝试从Message Queue中取出待 处理的消息,最后分发会Handler的handler Message()方法中。


1.Handler创建消息


        每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查 询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作 为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如 图所示。


Handler创建消息====》查询消息池=====》消息池是否有消息=====》是或否====》是就从消息池中取得消息对象;否就创建一个新的消息对象
2.Handler发送消息


UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程 只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列 MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。
Handler、Looper、MessageQueue的初始化流程如图所示:
UI线程创建一个Handler====》Handler获取对应的Looper====》是否创建过Looper====》是直接使用ThrcadLoca保存的UI线程对应的Looper;否就通过ThrcadLocal为UI线程创建唯一的一个Loopre之后在创建一个唯一一个消息队列MessageQueue




3.Handler处理消息


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


子线程通过Handler、Looper与UI主线程通信的流程如图所示。


子线程通过Handler创建一条消息====》子线程通过Handler将消息发送到UI线程对应的消息队列MessageQueue===》Looper查询消息队列是否有消息=====》是 就调用Handler处理消息;否就循环等待
阅读更多
上一篇上下文菜单以及选项菜单
下一篇事件分发机制
想对作者说点什么? 我来说一句

handler机制

2014年07月01日 1.98MB 下载

没有更多推荐了,返回首页

关闭
关闭