Android Handler 機制實現原理分析_Android

來源:互聯網
上載者:User

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 進行的詳解,後續繼續整理相關資料,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.