Handler詳解(最容易看懂,最容易理解)

好吧好吧,今天去面試的時候,一個熊二般的面試官問我handler的機制,以及和Looper的關係,以及更新UI有哪些方式。可是我是小白啊,所以不知道,所以就不可能通過面試,不過今年工作可真不好找。回來後又是把書籍,又是看視頻,最終還是打算寫成自己的博客。希望幫助到其他的小白。

下面我們通過六大模塊來了解下handler相關內容(有錯誤幫忙點出來,謝謝大家。我的理解還很片面和淺薄!)

一、什麼是handler?

答:handler是Android給我們提供用來更新UI的一套機制,也是一套消息處理機制,我們可以發消息,也可以通過它 處理消息。

二、那爲什麼要用handler呢?我能不能不用?

答:我在網上搜了下,給我的答案是,肯定是不行的。因爲android在設計的時候就封裝了一套消息創建、傳遞、處理。如果不遵循就不能更新UI信息,就會報出異常。

三、Android爲什麼要設計只能用handler機制更新UI呢?

答:最根本的目的就是爲了解決多線程併發的問題!

打個比方,如果在一個activity中有多個線程,並且沒有加鎖,就會出現界面錯亂的問題。但是如果對這些更新UI的操作都加鎖處理,又會導致性能下降。

處於對性能的問題考慮,Android給我們提供這一套更新UI的機制我們只需要遵循這種機制就行了。不用再去關係多線程的問題,所有的更新UI的操作,都是在主線程的消息隊列中去輪訓的。

四、handler、Looper、MessageQueue的原理是什麼?

答:大家都知道handler的作用有兩個,發送消息和處理消息。而handler發送的消息必須被送到指定MessageQueue(消息隊列)中,也就是說,如果想讓handler正常工作,就必須有一個MessageQueue(消息隊列),不過MessageQueue(消息隊列)是由Looper來關係。所以也可以說想讓handler正常工作,必須在當前線程中有一個Looper對象。(請認真讀)

1、來看一下Looper提供的構造器源碼,如圖:
在這裏插入圖片描述

你會發現該構造器用到的是private(私有化),告訴你的就是程序員你不能通過構造方法創建looper對象,而在方法中Looper創建了一個與關聯的MessageQueue,這個MessageQueue就是用來管理Message(handler接收和處理的消息對象)!

2、爲了保證當前線程有Looper對象,可以有兩種情況處理。(瘋狂的Android講義224頁)

(1)主ui線程啓動,系統就初始化了一個Looper對象,只要在程序中直接創建handler即可,然後用handler發送和處理消息。
(2)程序員自己創建的線程,這個時候就要自己手動創建一個Looper對象了,創建Looper對象調用它的prepare()。prepare()方法 是爲了保證每個線程最多一個Looper對象。
prepare()方法 源碼如圖。
在這裏插入圖片描述

然後用Looper.loop()啓動它。此時loop()方法就會使用一個死循環不斷地取出MessageQueue()中的消息,並將消息分給所對應的Handler處理。

好吧總結一下吧:

微笑:Looper的作用:每個線程只有一個Looper,他負責管理MessageQueue,會不斷的從MessageQueue取出消息,分發給對象 的handler

微笑:MessageQueue的作用:由Looper管理,而MessageQueue則採用先進的方法來管理Message!

微笑:Handler的作用:它把消息發送給Looper管理的MessageQueue,並負責處理Looper分發給他的消息。

五、Android在子線程更新UI的最常見的五種方式 (這裏不講解AsyncTask(異步任務))

1、runOnUiThread()方法
在這裏插入圖片描述

2、handler.post()方法

在這裏插入圖片描述

3、handler.sendMessage()方法
在這裏插入圖片描述

4、view.post()方法。

在這裏插入圖片描述
5、view postDelayed(Runnable,long)

前四種是慕課網老師講解的,最後一種是瘋狂Android講義書籍上有的一種。如果想要詳細瞭解,請點擊鏈接:點擊打開鏈接(慕課網講的很詳細,希望幫助到大家)。

六、非UI線程真的不能跟新UI嗎?

答:對着這個問題我就開始百度、查書籍、最後看慕課網,好吧!終於得到答案,答案就是:有些時候是可以更新UI的,在ViewRootImpl沒有實例化的時候是不會check是否是主線程,也就是說,在非UI線程中是可以更新UI的。至於具體理論,我把下面的視頻地址給貼上以方便小夥伴更詳細的瞭解。點擊打開鏈接(http://www.imooc.com/video/5726)!因爲我自己沒怎麼看懂,好丟臉!尷尬

好吧,對於Handler就說到這裏吧,可能講的很籠統,因爲自己技術能力原因,所以希望大家諒解,也希望大家自己去看視頻和書籍或者自己寫個小程序加深印象。(一邊查一遍總結,寫了3個小時,自己的能力還是太爛了,哎!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章