Handler的机制

Handler的机制:


我在学习和使用handler的时候,对与它相关的源代码进行的研究,说到handler机制,就要涉及到5个类,HandlerMessageQueueLooper、HandlerThreadMessage


Message(消息)

消息的类型,在 Handler 类中的 handleMessage 方法中得到单个的消息进行处理

它由MessageQueue统一列队,由Handler处理。


Handler

是处理者,他负责发送和处理Message消息。

可以发布或者处理一个消息或者操作一个 Runnable,通过 Handler 发布消息,消息将只会发送到与它关联的消息队列 , 然也只能处理该消息队列中的消息 


MessageQueue(消息队列)

它用来存放Handler发送过来的队列,并且按照先入先出的规则执行。

用来存放通过 Handler 发布的消息,通常附属于某一个创建它的线程,可以通过 Looper.myQueue() 得到当前线程的消息队列 


Looper

是 Handler 和消息队列之间通讯桥梁, 程序组件首先通过 Handler 把消息传递给 Looper, Looper 把消息放入队列。 Looper 也把消息队列里的消息广播给所有的 。

一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。

Looper 的作用就像抽水的水泵,它不断的从MessageQueue中去抽取Message并执行。


HandlerThread线程,是消息循环的执行场所。


Handler的机制_第1张图片

                                                                                                                                        图1.Handler机制


知道了这几个类就可以说说消息机制的原理了,在创建Activity之前,当系统启动的时候,先加载ActivityThread类(主线程或者UI线程),在这个类的main函数中,调用Looper.prepareMainLooper()进行初始化Looper对象,然后创建主线程的handler对象,随后才创建ActivityThread对象,最后Looper.loop()方法,不断的进行轮询消息队列中的消息。也就是说,在ActivityThreadActivity创建之前,就已经开启了Looperloop()方法,不断的进行轮询消息。


我们可以通过图1流程图来说明handler机制的原理:

我们通过Message.obtain()获取Message对象并准备消息数据之后。

1、使用sendMessage():通过Handler将消息发送给MessageQueue消息队列

2、在发送消息的时候,使用message.target=thishandler发送的message贴上当前handler的标签。

3、开启HandlerThread线程,执行run方法。

4、在HandlerThread类的run方法中开启轮询器进行轮询:调用Looper.loop()方法进行轮询消息队列的消息

5、在消息队列MessageQueueenqueueMessage(Message msg, long when)方法里,对消息进行入列,即依据传入的时间进行消息入列(排队)

6、轮询消息:与此同时,Looper在不断的轮询消息队列。

7、在Looper.loop()方法中,获取到MessageQueue对象后,从中取出消息(Message msg = queue.next()),如果没有消息会堵塞

8、分发消息:从消息队列中取出消息后,调用msg.target.dispatchMessage(msg);进行分发消息

9、将处理好的消息分发给指定的handler处理,即调用了handlerdispatchMessage(msg)方法进行分发消息。

10、在创建handler时,复写的handleMessage方法中进行消息的处理

11、回收消息:在消息使用完毕后 (Handler 处理完该 Message (update UI) 后),Looper 则设置该 Message 为 NULL,以便回收!在Looper.loop()方法中调用msg.recycle(),将消息进行回收,即将消息的所有字段恢复为初始状态。

 

附加:

三个判断,优先级从高到低:
1) Message 里面的 Callback,一个实现了 Runnable 接口的对象,其中 run 函数做处理工作;
2) Handler 里面的 mCallback 指向的一个实现了 Callback 接口的对象,由其 handleMessage 进行处理;
3) 处理消息 Handler 对象对应的类继承并实现了其中 handleMessage 函数,通过这个实现的 handleMessage 函数处理消息。
由此可见,我们实现的 handleMessage 方法是优先级最低的!


最简单的方法  ——判断 Handler 对象里面的 Looper 对象是属于哪条线程的,则由该线程来执行! 
1. 当 Handler 对象的构造函数的参数为空,则为当前所在线程的 Looper;
2. Looper.getMainLooper()得到的是主线程的 Looper 对象,Looper.myLooper()得到的是当前线程的 Looper 对象

你可能感兴趣的:(handler)