Android 的 Handler 機制實現原理分析
handler在安卓開發中是必須掌握的技術,但是很多人都是停留在使用階段。使用起來很簡單,就兩個步驟,在主執行緒重寫handler的handleMessage( )方法,在工作執行緒傳送訊息。但是,有沒有人想過這種技術是怎麼實現的呢?下面我們一起探討下。
先上圖,讓大家好理解下handler機制:
handler機制示例圖
上面一共出現了幾種類,ActivityThread,Handler,MessageQueue,Looper,msg(Message),對這些類作簡要介紹:
ActivityThread:程式的啟動入口,為什麼要介紹這個類,是因為該類就是我們說的主執行緒,它對Looper進行操作的。
Handler:字面意思是操控者,該類有比較重要的地方,就是通過handler來傳送訊息(sendMessage)到MessageQueue和 操作控制元件的更新(handleMessage)。handler下面持有這MessageQueue和Looper的物件。
MessageQueue:字面意思是訊息佇列,就是封裝Message類。對Message進行插入和取出操作。
Message:這個類是封裝訊息體並被髮送到MessageQueue中的,給類是通過連結串列實現的,其好處方便MessageQueue的插入和取出操作。還有一些欄位是(int what,Object obj,int arg1,int arg2)。what是使用者定義的訊息和程式碼,以便接收者(handler)知道這個是關於什麼的。obj是用來傳輸任意物件的,arg1和arg2是用來傳遞一些簡單的整數型別的。
下面,我們按照啟動順序來進行原始碼分析:
從上面可以看出,ActivityThread類是用來啟動Android的,其原始碼為:
ActivityThread類:
接下來,我們看到Looper類了,我們進去看看裡面的原始碼實現:
首先,我們看看裡面有哪些欄位:
Looper的內部屬性
然後我們迫不及待地要想去看看prepareMainLooper方法,到底幹了什麼
Looper.prepareMainLooper()方法
這裡我們可以看到,prepareMainLooper是為了設定一個持有訊息佇列和訊息序列器的Looper進去ThreadLocal。接下來我們看看loop方法吧:
Looper.loop()方法
我們可以看到loop方法中,會取出內部的訊息序列器,並且迭代裡面的訊息,根據訊息的target分發訊息(到handleMessage方法中)。如果你有疑問,你應該是不清楚Looper的MessageQueue為什麼會有Message。那麼我們就馬上去看,到底是哪裡新增訊息的。話說,到了這裡我也好像沒有分析到和我們handler相關的操作吧。因為你和我都知道handler的作用是sendMessage和handleMessage,所以我們知道,Looper中的訊息序列器的訊息體,肯定是從sendMessage中新增進去的。不墨跡,我們馬上進入Handler的原始碼分析。
首先,我們先看看Handler的欄位:
Handler的欄位
接著,我們看看Handler的構造方法,我們可以看到,Handler有兩類構造方法(別看到6個,它們都是往這兩種方法呼叫的):
Handler的構造方法
接著,我們要進入Handler.dispatchMessage()方法,因為我們要解釋上面剛剛Looper.loop方法。dispatchMessage的方法很簡單,只有三個方向,其原始碼為:
Handler.dispatchMessage()方法
到這裡為止,執行程式碼就結束了。那麼問題來了,訊息從哪裡來的?帶著這個疑問,我們馬上進入Handler.sendMessage()邏輯去看看,其原始碼是:
Handler.sendMessage()方法
好不容易找到了傳送訊息的邏輯並理解了,但是還要去殼,在MessageQueue中分析了,首先,我們回顧下,訊息序列器是在Looper.prepare()中初始化的。MessageQueue原始碼,構造方法很簡單:
MessageQueue構造方法
然後我們再到達MessageQueue.enqueueMessage()方法中看原始碼:
MessageQueue.enqueueMessage()方法
這個是傳送訊息的最終執行程式碼,就是把訊息放進訊息序列器。在Looper.loop()方法中,我們是需要不斷從訊息序列器中取出訊息的。其過程也是我們可以進去MessageQueue.next()的原始碼中看看:
MessageQueue.next()方法
這樣,整個過程就完成了。在這些執行過程中,Message是它們的物件。我們可以看看Message的結構:
Message的欄位
除此之外,Message的資料結構是基於連結串列的,方法都很簡單的,我就不貼出來了。
總結一下,其實就是用一個ThreadLocal來儲存物件,然後在執行的時候,能夠保證物件的不變形,這樣就能達到在主先執行緒更新UI了。
相關文章
- Android-Handler訊息機制實現原理Android
- Android 原始碼分析(二)handler 機制Android原始碼
- Android Handler MessageQueue Looper 訊息機制原理AndroidOOP
- Android Handler機制之Handler 、MessageQueue 、LooperAndroidOOP
- Android RollBack機制實現原理剖析Android
- Android訊息機制HandlerAndroid
- android訊息機制—HandlerAndroid
- Android Handler機制之ThreadLocalAndroidthread
- Android的Handler訊息機制 解析Android
- android 非同步通訊機制Handler的分析與運用Android非同步
- Android訊息機制Handler用法Android
- Android Handler訊息傳遞機制:圖文解析工作原理Android
- Android Handler機制之Message及Message回收機制Android
- Android Handler原理Android
- Android Handler 訊息機制詳述Android
- Android Handler機制之總目錄Android
- Handler原理分析
- Android 訊息機制:Handler、MessageQueue 和 LooperAndroidOOP
- Android Handler機制之Message的傳送與取出Android
- 講講Handler實現原理
- Android 9.0 原始碼_機制篇 -- 全面解析 HandlerAndroid原始碼
- Android Handler機制理解和AsyncTask使用小記Android
- Android進階;Handler訊息機制詳解Android
- Android 之 “只是想來談談 Handler 機制”Android
- Android--Handler機制及原始碼詳解Android原始碼
- Android Handler訊息機制原始碼解讀Android原始碼
- Android Handler機制之記憶體洩漏Android記憶體
- Tomcat 7 啟動分析(五)Lifecycle 機制和實現原理Tomcat
- Handler機制解析
- Android訊息機制全面解析(Handler,MessageQueue,Looper,Threadlocal)AndroidOOPthread
- Android之Handler訊息傳遞機制詳解Android
- Android Handler機制之迴圈訊息佇列的退出Android佇列
- Android IPC 機制分析Android
- 藉助 AIDL 理解 Android Binder 機制——AIDL 的使用和原理分析AIAndroid
- Android進階5:SurfaceView實現原理分析AndroidView
- 再讀Handler機制
- 移動架構 (二) Android 中 Handler 架構分析,並實現自己簡易版本 Handler 框架架構Android框架
- Handler訊息機制完全解析Handler解析
- Android Handler與Looper原理簡析AndroidOOP