1. 程式人生 > >淺談對handle的理解

淺談對handle的理解

handler是Android中重要的訊息機制,我們在平常的開發中也是經常接觸到的,下面是我個人總結的一些觀點和理解,希望和大家分享一起討論。

首先呢,Handler的主要工作是採用當前執行緒的Loop來構建內部的訊息迴圈系統。講到handle就不得不提起MessageQuequeloop了,畢竟這哥三可是好基友啊!其中,MessageQueque顧名思義,就是訊息佇列的意思,它裡面主要有這兩種方法,一個是send(),一個是enQueueMessage(),以佇列的形式的傳送和插入訊息。雖然它叫做訊息佇列,但是其內部結構卻是單向的連結串列,就像我們平時看到一些人看著很壯實,實際上是個娘炮。哈哈哈,不知道這個比喻是不是能更容易接受。而Looper呢,翻譯過來就是迴圈了,你想想啊,MessageQueque是個只能儲存訊息,但是它處理不了訊息,這時候它的二哥looper就上場了,它可是個出了名的勤勞,一上來就給自己套了一個死迴圈,一直去尋找訊息,如果沒找到,就在那邊等待,沒錯,就是應用了很像執行緒池的原理。啥?你說looper使用了死迴圈沒有發生ANR?只能說小夥子你還年輕,如果你仔細的去看原始碼就會發現其實很多都是有由linux和c++程式設計的,並不是僅僅只用了java ,這邊的

for (;;) { Message msg = queue.next(); // might block if (msg == null) { // No message indicates that the message queue is quitting. return; } 迴圈在我這邊看來更像是車產車價提供動力的而已。

既然說到了looper,就要提提其中的一個特殊存在Threadlocal,別看人家前面是thread就以為它是執行緒,它的作用是在每個執行緒中儲存資料,當Handler建立之後,就是通過Threadlocal來獲取當前執行緒的looper才能工作的。Threadlocal的工作場景比較特殊,1,需要線上程作為作用域,2,不同的執行緒之間具有不用的資料副本的時候。比如還有采用事件監聽的時候,在一些函式呼叫棧深的情況下,使用起來還是槓槓滴好。

記住一句話,一個執行緒內對應的只有一個loop,這個是唯一的!Threadlocal內部的資料遵循著相互隔離,互不干擾的原則,也就是執行緒隔離,裡面儲存的形式就是用key,vaues的雜湊i形式。

然後呢,



這個圖呢是在動腦直播的時候截圖下來的,賊清晰,裡面的工作原理就一目瞭然了,Handler先進行訊息的傳送,發到了MessageQueque那邊,looper就是個傳送帶,loop.prepare()就是個動力開關,然後通過Looper.loop()來開啟訊息迴圈,直到訊息執行了next(),返回null為止,這期間handle有一個handerCallBack()把訊息回傳給了handler,這就是Handler的通訊機制啦。