Android 的消息機制就是 Handler 的運行機制。
Handler 和 MessageQueue栋烤、Looper 的關系
- MessageQueue 中以單鏈表的形式存儲的一組 Message波材,但它不能去處理优训,而 Looper 就是填補這個功能的。
- Looper 以無限循環(huán)的方式去查找是否有新消息各聘,有就處理,否則一直等待抡医。
Handler 的運行需要 MessageQueue 和 Looper 躲因。
Handler 中包含 MessageQueue 和 Looper 的引用:
public class Handler {
final MessageQueue mQueue;
final Looper mLooper;
}
public final class Looper {
final MessageQueue mQueue;
}
- 創(chuàng)建 Handler 需要當前 Thread 的 Looper,Looper 中會創(chuàng)建 MessageQueue忌傻;
- Thread 中包含 ThreadLocal.Values localValues大脉,localValues中存儲的 Looper;
Handler 的工作流程
Handler 的工作流程.png
- Handler 調用 sendMessage 方法發(fā)送消息水孩;
- sendMessage 方法的實現為向 MessageQueue 中插入一條消息镰矿,即調用 MessageQueue 的 enqueueMessage 方法;
- Looper 的 loop 方法會不停的調用 MessageQueue 中的 next 方法來獲取 Message俘种;
- Looper 獲取到 Message 后秤标,調用通過 Message 獲取到的 Handler 對象(msg.target)的 dispatchMessage 方法來處理消息绝淡。
- Handler 的 dispatchMessage 方法是在創(chuàng)建 Handler 時所使用的 Looper 中執(zhí)行的,這樣就成功的將代碼邏輯切換到指定的線程中去執(zhí)行了苍姜。