Handler源码详解

Handler - 消息的发送者和最终消费者

首先:Handler的初始化、需要重写 handleMessage()方、而该方法就是最终的消费的地方

Handler源码详解_第1张图片

然后:Handler发送消息的方法,所有的sendMessage和post方法最终都是调用个sendMessageAtTime()方法再调用enqueueMessage()方法

Handler源码详解_第2张图片
Handler源码详解_第3张图片
                                最后是调用的是 mQueue.enqueueMessage()


Handler源码详解_第4张图片
handler的初始化

可以看出 handler 中的Looper和mQueue 是 Looper.myLooper()方法获得的

Handler源码详解_第5张图片
获取mLooper对象
Handler源码详解_第6张图片
sTheradLocal的初始化方法

prepare初始化sThreadLocal、而prepare参数是在线程初始化的时候需要调用

Handler源码详解_第7张图片
ui线程初始化

而MessageQueue的enqueueMessage()方法 最主要的作用则是将所有Message以一种链表结构串起来。

Handler源码详解_第8张图片
MessageQueue.enqueueMessage()将message串起来

最后再回到Looper类。ui线程的初始化中都会在最后调用Looper.loop() 来看一下这个方法

Handler源码详解_第9张图片
loop( ) 实际就是开启了一个死循环、不停的从MessageQueue中拿出message执行 

那么最终执行者就是Message对象中target属性的dispatchMessage方法


Message. target 就是一开始 发消息的handler


Handler源码详解_第10张图片
发现没有这个就是我们重写的方法

最后发现调用我们重写的方法。

总结: 

    Handler - 消息的发送者和最终消费者

    Message - 消息、所有的数据

    MessageQueue - 将消息串起来。供Looper调用

    Looper -  循环调用MessageQueue的消息链、交与message中的handler处理掉

你可能感兴趣的:(Handler源码详解)