谈谈 android Handler机制--标准答案

2021-01-19  本文已影响0人  一方乌鸦

最详细的讲解:
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 同步屏障 和 异步消息

IdleHandler

SyncBarrier(同步障碍器)与IdleHandler(闲时任务)机制都是通过 MQ 的 next() 方法提供的,
执行IdleHandler其实就是调用其queueIdle()方法,queueIdle()如果返回false,next()方法会将该IdleHandler从mIdleHandlers中删除。这样的话,下一次next()方法再执行IdleHandler时就不会再重复执行它了。

Looper.prepare() 做了什么事情

new 一个 Looper,然后保存在 ThreadLocal 中,和当前线程绑定

上一篇下一篇

猜你喜欢

热点阅读