Android 的消息機(jī)制

Android 的消息機(jī)制就是 Handler 的運(yùn)行機(jī)制。

Handler 和 MessageQueue、Looper 的關(guān)系

  1. MessageQueue 中以單鏈表的形式存儲的一組 Message,但它不能去處理,而 Looper 就是填補(bǔ)這個(gè)功能的。
  2. 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;
}
  1. 創(chuàng)建 Handler 需要當(dāng)前 Thread 的 Looper,Looper 中會創(chuàng)建 MessageQueue;
  2. Thread 中包含 ThreadLocal.Values localValues,localValues中存儲的 Looper;

Handler 的工作流程

Handler 的工作流程.png
  1. Handler 調(diào)用 sendMessage 方法發(fā)送消息;
  2. sendMessage 方法的實(shí)現(xiàn)為向 MessageQueue 中插入一條消息,即調(diào)用 MessageQueue 的 enqueueMessage 方法;
  3. Looper 的 loop 方法會不停的調(diào)用 MessageQueue 中的 next 方法來獲取 Message;
  4. Looper 獲取到 Message 后,調(diào)用通過 Message 獲取到的 Handler 對象(msg.target)的 dispatchMessage 方法來處理消息。
  5. Handler 的 dispatchMessage 方法是在創(chuàng)建 Handler 時(shí)所使用的 Looper 中執(zhí)行的,這樣就成功的將代碼邏輯切換到指定的線程中去執(zhí)行了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容