最详细的讲解:
https://www.jianshu.com/p/e172a2d58905
https://www.jianshu.com/p/b4d745c7ff7a
handler机制涉及到的类有Looper,Handler,MessageQueue和Message。
一句话概括,Looper不断获取MessageQueue中的Message,交给Handler处理,同时Handler还向MessageQueue中投递Message。
1.Handler
首先Handler与线程Thread是一对多的关系,因为每个Thread只对应一个Looper,每个Looper只对应一个MessageQueue,每个MQ中有多个Message,每个Message最多指定一个Handler处理。Handler有两个作用,一是处理Message,二是将某个Message压入MQ中。
实现第一个作用的方法是dispatchMessage和handleMessage. Looper从MQ中取出一个Message后,先调用Handler.dispatchMessage进行分发,流程是如果Message.callback不是空,执行该callback;如果Handler.callback不是空,执行该callback;如果前面的callback都不存在,调用Handler.handleMessage.
实现第二个作用的方法是send系列方法和post系列方法. send系列需要的参数是一个Message,post需要的参数是Runnable,本质上是把Runnable设置为一个Message的callback,再压入MQ。
2.MessageQueue
MessageQueue是一个队列,有入队出队,新增和销毁等方法。
3.Looper
程序中的Looper有两种情况,主线程的Looper和普通线程的Looper。它的使用都有3个步骤:1.Looper.prepare;2.创建处理消息的Handler;3.Looper.loop() .
prepare方法中会在当前线程的ThreadLocal中保存一份Looper。ThreadLocal是一种线程内的全局变量,不同线程中的ThreadLocal相互独立无法访问。Handler的构造方法会获取当前线程的Looper,同时保存Looper的MQ
这样四个对象就串起来了
其他知识点
https://www.cnblogs.com/muouren/p/11706454.html
https://blog.csdn.net/asdgbc/article/details/79148180
Handler 同步屏障 和 异步消息
-
Handler中的Message可以分为两类:同步消息、异步消息,一般情况下这两种消息的处理方式没什么区别,只有在设置了同步屏障时才会出现差异。
-
从代码层面上来讲,同步屏障就是一个Message,一个target字段为空的Message。
设置了同步屏障之后,Handler只会处理异步消息。再换句话说,同步屏障为Handler消息机制增加了一种简单的优先级机制,异步消息的优先级要高于同步消息。 -
如何使用异步消息?
异步消息是不能使用的,因为相关设置都是hide。
handler的相关构造函数,hide
Mesasge.setAsynchronous(boolean),hide
IdleHandler
SyncBarrier(同步障碍器)与IdleHandler(闲时任务)机制都是通过 MQ 的 next() 方法提供的,
执行IdleHandler其实就是调用其queueIdle()方法,queueIdle()如果返回false,next()方法会将该IdleHandler从mIdleHandlers中删除。这样的话,下一次next()方法再执行IdleHandler时就不会再重复执行它了。
Looper.prepare() 做了什么事情
new 一个 Looper,然后保存在 ThreadLocal 中,和当前线程绑定
网友评论