主要有5个类
Handler 负责发消息和处理消息
Message 消息对象
MessageQueue 消息队列,负责存储消息对象 本质是优先队列
Looper 消息轮询器 负责从MQ中取消息并传给Handler,让其处理
ThreadLocal 保存Looper
发送消息
Handler 使用 sendMessage() 方法发送消息,
最后调用到 MessageQueue 的 enqueueMessage()方法,向队列里添加消息
这里有个关键点 Message 有个值 when(when = 当前时间戳+delay),添加消息的时候会将when的大小当做优先级将MessageQueue 重新排列,
轮训消息
Looper.loop();
接收并处理消息
Looper 会从 MessageQueue 中取出消息
然后会发现有这个逻辑 msg.target.dispatchMessage(msg); 其中 target 就是Handler
Handler 的 dispatchMessage() 方法 最终调用的是 handleMessage() 方法
首先创建handler的时候必须要有Looper, 但是activity中默认已经创建了looper, 但是新开的线程,要想初始化handler,就必须调用
Looper.parepare()去创建一个,初始化handler对象之后调用, Looper.loop()处理数据. Handler跟其绑定的Looper 在同一个线程
handler的handleMessage会在dispatchMesage() 中执行, 而dispatchMessage()会在looper的loop()方法里调用;
在loop()方法中会先获取Looper对象
final Looper me = myLooper()
Looper会由静态, 不可变 ThreadLocal管理, ThreadLocal 内部有个 ThreadLocalMap 来存储对象 但是是非静态的 所以每个线程都各有一份.
Message 从MessageQueue中取出, 而MessageQueue由looper管理, handler对象保存在Message中
总结:一个线程中可以创建多个Handler,只能存在一个Looper,只有一个message queue,通过targer去判断哪个Handler去处理消息