Android-Handler機制,面試解答
本文轉載自:
Handler
1、handler是什麼?
答:handler是更新UI介面的機制,也是訊息處理的機制,我們可以傳送訊息,也可以處理訊息
2、為什麼要有Handler?
答:Android在設計的時候,封裝了一套訊息建立、傳遞、處理機制,如果不遵循這樣的機制就沒辦法更新UI資訊,就會丟擲異常。
3、handler怎麼用?
答:1、post(Runnable);
2、postDelayed(Runnable ,long);
3、sentMessage
4、sentMessageDelayed
4、Android為什麼要設定只能通過Handler機制更新UI?
答:最根本的問題解決多執行緒併發的問題;
假設如果在一個Activity中,有多個執行緒去更新UI,並且都沒有加鎖機制,馬麼會產生生麼樣的問題?——更新介面混亂;
如果對更新UI 的操作都加鎖處理的話會產生什麼樣子的問題?——效能下降
對於上述問題的考慮,Android提供了一套更新UI的機制,我們只需要遵循這樣的機制就好了。
不用關心多執行緒的問題,更新UI的操作,都是在主執行緒的訊息隊列當中輪詢處理的。
5、handler的原理是什麼?
答:1、handler封裝訊息的傳送(主要包括訊息傳送給誰)
2、Looper——訊息封裝的載體。(1)內部包含一個MessageQueue,所有的Handler傳送的訊息都走向這個訊息佇列;(2)Looper.Looper方法,就是一個死迴圈,不斷地從MessageQueue取訊息,如果有訊息就處理訊息,沒有訊息就阻塞。
3、MessageQueue,一個訊息佇列,新增訊息,處理訊息
4、handler內部與Looper關聯,handler->Looper->MessageQueue,handler傳送訊息就是向MessageQueue佇列傳送訊息。
總結:handler負責傳送訊息,Looper負責接收handler傳送的訊息,並把訊息回傳給handler自己。
MessageQueue儲存訊息的容器。
6、HandlerThread的作用是什麼?
答:HandlerThread thread=new HandlerThread("handler thread");自動含等待機制,等Looper建立好了,才建立Handler,避免出現空指標異常。
7、主執行緒
* ActivityThread 預設建立main執行緒,main中預設建立Looper,Looper預設建立MessageQueue
* threadLocal儲存執行緒的變數資訊,方法包括:set,get
8、Android更新UI的方式?
答:1、runOnUIThread
2、handler post
3、handler sendMessage
4、view post
9、非UI執行緒真的不能更新UI嗎?
答:不一定,之所以子執行緒不能更新介面,是因為Android線上程的方法裡面採用checkThread進行判斷是否是主執行緒,而這個方法是在ViewRootImpl中的,這個類是在onResume裡面才生成的,因此,如果這個時候子執行緒在onCreate方法裡面生成更新UI,而且沒有做阻塞,就是耗時多的操作,還是可以更新UI的。
10、使用Handler遇到的問題?
答:比如說子執行緒更新UI,是因為觸發了checkThread方法檢查是否在主執行緒更新UI,還有就是子執行緒中沒有Looper,這個原因是因為Handler的機制引起的,因為Handler傳送Message的時候,需要將Message放到MessageQueue裡面,而這個時候如果沒有Looper的話,就無法迴圈輸出MessageQueue了,這個時候就會報Looper為空的錯誤。
11、主執行緒怎麼通知子執行緒?
答:可以利用HandlerThread進行生成一個子執行緒的Handler,並且實現handlerMessage方法,然後在主執行緒裡面也生成一個Handler,然後通過呼叫sendMessage方法進行通知子執行緒。同樣,子執行緒裡面也可以呼叫sendMessage方法進行通知主執行緒。這樣做的好處比如有些圖片的載入啊,網路的訪問啊可能會比較耗時,所以放到子執行緒裡面做是比較合適的。