Android 的消息机制就是 Handler 的运行机制。
Handler 和 MessageQueue、Looper 的关系
- MessageQueue 中以单链表的形式存储的一组 Message,但它不能去处理,而 Looper 就是填补这个功能的。
- Looper 以无限循环的方式去查找是否有新消息,有就处理,否则一直等待。
Handler 的运行需要 MessageQueue 和 Looper 。
Handler 中包含 MessageQueue 和 Looper 的引用:
public class Handler {
final MessageQueue mQueue;
final Looper mLooper;
}
public final class Looper {
final MessageQueue mQueue;
}
- 创建 Handler 需要当前 Thread 的 Looper,Looper 中会创建 MessageQueue;
- Thread 中包含 ThreadLocal.Values localValues,localValues中存储的 Looper;
Handler 的工作流程
- Handler 调用 sendMessage 方法发送消息;
- sendMessage 方法的实现为向 MessageQueue 中插入一条消息,即调用 MessageQueue 的 enqueueMessage 方法;
- Looper 的 loop 方法会不停的调用 MessageQueue 中的 next 方法来获取 Message;
- Looper 获取到 Message 后,调用通过 Message 获取到的 Handler 对象(msg.target)的 dispatchMessage 方法来处理消息。
- Handler 的 dispatchMessage 方法是在创建 Handler 时所使用的 Looper 中执行的,这样就成功的将代码逻辑切换到指定的线程中去执行了。