Android开发之Handler机制记录
1、Handler 機制
說到 Handler,就不得不提與之密切相關的這幾個類:Message、MessageQueue,Looper;
Message:?Message 中有兩個成員變量值得關注:target 和 callback。
target 其實就是發送消息的 Handler 對象
callback 是當調用 handler.post(runnable)?時傳入的 Runnable 類型的任務。post 事件的本質也是創建了一個 Message,將我們傳入的這個 runnable 賦值給創建的Message的 callback 這個成員變量;
MessageQueue:?消息隊列很明顯是存放消息的隊列,值得關注的是 MessageQueue 中的 next()?方法,它會返回下一個待處理的消息;
Looper:?Looper 消息輪詢器其實是連接 Handler 和消息隊列的核心。首先我們都知道,如果想要在一個線程中創建一個 Handler,首先要通過 Looper.prepare()?創建 Looper,之后還得調用 Looper.loop()開啟輪詢。我們著重看一下這兩個方法;
prepare()。?這個方法做了兩件事:首先通過ThreadLocal.get()獲取當前線程中的Looper,如果不為空,則會拋出一個RunTimeException,意思是一個線程不能創建2個Looper。如果為null則執行下一步。第二步是創建了一個Looper,并通過 ThreadLocal.set(looper)。將我們創建的Looper與當前線程綁定。這里需要提一下的是消息隊列的創建其實就發生在Looper的構造方法中;
loop()。?這個方法開啟了整個事件機制的輪詢。它的本質是開啟了一個死循環,不斷的通過 MessageQueue的next()方法獲取消息。拿到消息后會調用 msg.target.dispatchMessage()來做處理。其實我們在說到 Message 的時候提到過,msg.target?其實就是發送這個消息的 handler。這句代碼的本質就是調用 handler的dispatchMessage();
Handler:?上面做了這么多鋪墊,終于到了最重要的部分。Handler 的分析著重在兩個部分:發送消息和處理消息。
*發送消息。其實發送消息除了 sendMessage 之外還有 sendMessageDelayed 和 post 以及 postDelayed 等等不同的方式。但它們的本質都是調用了 sendMessageAtTime。在 sendMessageAtTime 這個方法中調用了 enqueueMessage。在 enqueueMessage 這個方法中做了兩件事:通過 msg.target = this?實現了消息與當前 handler 的綁定。然后通過 queue.enqueueMessage?實現了消息入隊;
處理消息。?消息處理的核心其實就是dispatchMessage()這個方法。這個方法里面的邏輯很簡單,先判斷 msg.callback?是否為 null,如果不為空則執行這個 runnable。如果為空則會執行我們的handleMessage方法;
總結
以上是生活随笔為你收集整理的Android开发之Handler机制记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发之带行号显示的Log工
- 下一篇: 英雄联盟手游阿木木装备怎么出 lol手游