Android 之訊息機制
Android的訊息機制主要是指Handler的執行機制,Handler的執行主要由MessageQueue(訊息佇列)和Looper(訊息迴圈泵)來支撐。MessageQueue只要儲存訊息,它是以佇列的形式對外提供刪除插入的工作,雖然是佇列 但它不是真正的佇列,底部還是採用的單連結串列的資料結構來儲存資訊列表的。由於MessageQueue只是一個訊息儲存單元,不會去處理訊息,這時候Looper就出現了,Looper就會以無限迴圈的形式去查詢是否有新訊息,如果有的話就會處理 ,如果沒有就會等待。 Looper中有一個重要的而有特殊的概念那就是ThreadLocal。
ThreadLocal是什麼呢?
它並不是執行緒,它的作用是可以在每個執行緒中儲存資料,Handler是如何獲取當前的Looper呢?這也需要ThreadLocal,ThreadLocal不僅可以在每個執行緒互不干擾的情況下儲存資料,還可以獲取每個執行緒的Looper。
這裡需要注意一個點就是執行緒預設可是沒有Looper的,如果使用Handler就必須為執行緒建立Looper。
我們經常提到的主執行緒也叫UI執行緒,他就是Activity Thread,ActivityThread被建立時就會初始化Looper,這也是主執行緒預設可以使用Handler的原因。下面就是Handler的工作過程圖

Handler工作過程
Message Queue的工作原理
它的作用主要是插入和讀取。讀取的操作會伴隨著刪除功能。插入方法enqueueMessage,讀取方法next,next方法沒取出一條訊息並將其從佇列中移除。
Looper的工作原理
Looper在Android中扮演著訊息迴圈的角色,具體來說就是不停的檢視訊息佇列中是否有新的訊息,如果有新訊息就會被處理,否則會被阻塞 首先我們先看看它的構造方法

Looper構造方法
它的構造方法會建立一個Message Queue,然後再把當前的執行緒物件儲存起來。我們知道Handler的工作是需要Looper,沒有Looper的執行緒就會報錯,那麼如何為一個執行緒建立Looper呢?很簡單,就是呼叫Looper.prepare()方法來建立一個Looper,接著通過:Looper.loop()來開啟訊息迴圈的如下圖所示

Looper除了prepare方法外,還有prepareMainLooper方法,這個方法主要給主執行緒(ActivityThread)建立Looper使用的,其本質還是通過prepare方法實現的,這個Looper提供了getMain Looper方法,通過它可以在任何地方獲取到主執行緒的Looper,此外Looper也是可以退出的,通過quit和quitSafely來退出Looper,quit是直接退出,而quitSafely是做標記等到所有的訊息處理完後才安全退出。如果退出Looper 執行緒就會終止,所以不建議推出。
Looper中最重要的方法就是loop方法,只有呼叫了訊息系統才會起作用。


其實很好理解,loop方法是一個死迴圈,唯一跳出迴圈的方式是MessageQueue的next方法返回了null,怎麼返回null呢?當Looper的quit方法被呼叫時Looper就會呼叫quit方法或者quitSafely來退出訊息佇列,這是就會返回null。如果得到新的訊息就會通過msg.target.dispatchMessage(msg)方法處理訊息,msg.target是傳送訊息的Handler物件,這樣Handler傳送訊息就交給了dispatchMessage方法處理,而dispatchMessage方法是在建立Handler時所用的Looper中執行,所以就把邏輯程式碼切換到指定執行緒中執行了。
Handler的工作原理
Handler的工作主要是傳送訊息和接收過程,通過post和send方法來實現傳送訊息。


Handler傳送訊息只是向訊息佇列中插入了一條訊息,Message Queue的next方法返回給Looper,Looper收到訊息處理再交給Handler處理,也就是dispatchMessage方法


首先檢查Message的callback是否為null,如果不為null就通過handleCallback來處理,其實Message的callback是一個Runnable物件,實際上也是Handlerpost方法傳遞的Runnable引數。

然後檢查嗎Callback是否為null,不為null就呼叫handleMessage方法來處理。Callback程式碼如下

通過Callback也可建立Handler物件:Handler handler = new Handler(callback)。
下圖是Handler的流程圖

Handler訊息處理流程圖
這就是Android的訊息機制Handler
相關文章
- 理解 Android 訊息機制Android
- Android訊息機制HandlerAndroid
- android訊息機制—HandlerAndroid
- 06.Android之訊息機制問題Android
- Android之Handler訊息傳遞機制詳解Android
- Android非同步訊息機制Android非同步
- Android訊息機制Handler用法Android
- Android 訊息機制詳解(Android P)Android
- Android的Handler訊息機制 解析Android
- Android Handler 訊息機制詳述Android
- 深入理解Android訊息機制Android
- Android Handler機制之迴圈訊息佇列的退出Android佇列
- Android全面解析之由淺及深Handler訊息機制Android
- Android 訊息機制:Handler、MessageQueue 和 LooperAndroidOOP
- 全面剖析Android訊息機制原始碼Android原始碼
- Android Handler MessageQueue Looper 訊息機制原理AndroidOOP
- 由外到內——剖析Android訊息機制Android
- Android進階;Handler訊息機制詳解Android
- Android Handler訊息機制原始碼解讀Android原始碼
- Android-Handler訊息機制實現原理Android
- 原始碼分析:Android訊息處理機制原始碼Android
- Android應用程式訊息處理機制Android
- Android Handler機制之訊息池的擴充套件 SimplePool與SynchronizedPoolAndroid套件synchronized
- Android中的非同步訊息處理機制Android非同步
- Android訊息機制全面解析(Handler,MessageQueue,Looper,Threadlocal)AndroidOOPthread
- 書海拾貝|開發藝術探索之 android 的訊息機制Android
- iOS進階之訊息轉發機制iOS
- JAVA訊息確認機制之ACK模式Java模式
- Android訊息機制,從Java層到Native層剖析AndroidJava
- Android原始碼解析之一 非同步訊息機制Android原始碼非同步
- 深入理解Android非同步訊息處理機制Android非同步
- 訊息機制篇——初識訊息與訊息佇列佇列
- Android Handler訊息傳遞機制:圖文解析工作原理Android
- android 訊息傳遞機制進階EventBus的深入探究Android
- Android之訊息推送原理Android
- Fluter訊息機制之微任務實現原理
- Rabbitmq可靠訊息投遞,訊息確認機制MQ
- 重拾 ObjC 訊息機制OBJ