Android 的消息機(jī)制就是 Handler 的運(yùn)行機(jī)制。
Handler 和 MessageQueue、Looper 的關(guān)系
- MessageQueue 中以單鏈表的形式存儲的一組 Message,但它不能去處理,而 Looper 就是填補(bǔ)這個(gè)功能的。
- Looper 以無限循環(huán)的方式去查找是否有新消息,有就處理,否則一直等待。
Handler 的運(yùn)行需要 MessageQueue 和 Looper 。
Handler 中包含 MessageQueue 和 Looper 的引用:
public class Handler {
final MessageQueue mQueue;
final Looper mLooper;
}
public final class Looper {
final MessageQueue mQueue;
}
- 創(chuàng)建 Handler 需要當(dāng)前 Thread 的 Looper,Looper 中會創(chuàng)建 MessageQueue;
- Thread 中包含 ThreadLocal.Values localValues,localValues中存儲的 Looper;
Handler 的工作流程

Handler 的工作流程.png
- Handler 調(diào)用 sendMessage 方法發(fā)送消息;
- sendMessage 方法的實(shí)現(xiàn)為向 MessageQueue 中插入一條消息,即調(diào)用 MessageQueue 的 enqueueMessage 方法;
- Looper 的 loop 方法會不停的調(diào)用 MessageQueue 中的 next 方法來獲取 Message;
- Looper 獲取到 Message 后,調(diào)用通過 Message 獲取到的 Handler 對象(msg.target)的 dispatchMessage 方法來處理消息。
- Handler 的 dispatchMessage 方法是在創(chuàng)建 Handler 時(shí)所使用的 Looper 中執(zhí)行的,這樣就成功的將代碼邏輯切換到指定的線程中去執(zhí)行了。