1. 程式人生 > >Android-Handler機制詳解

Android-Handler機制詳解

Handler
1、handler是什麼?
答:handler 是更新UI介面的機制,也是訊息處理的機制,我們可以傳送訊息,也可以處理訊息
2、為什麼要有Handler?
答:Android在設計的時候,封裝了一套訊息建立,傳遞,處理機制,如果不遵循這樣的機制就沒法更新UI資訊,就會丟擲異常。
3、handler怎麼用?
答:1.post(Runnable)
2.postDelayed(Runnable,long)
3.sendMessage
4sendMessageDelayed
4、Android為什麼要設定只能通過Handler機制更新UI?
答:最根本的問題是解決多執行緒併發的問題
假設如果一個activity中,有多個執行緒去更新UI,並且都沒有加鎖機制,那麼會產生什麼樣的問題?——更新介面混亂;
如果對更新UI 的操作都加鎖處理的話會產生什麼樣子的問題?——效能下降
對於上述問題的考慮,Android提供了一套更新UI的機制,我們只需要遵循這樣的機制就好了。
不用關心多執行緒的問題,更新UI的操作,都是在主執行緒的訊息隊列當中輪詢處理的。
5、handler的原理是什麼?
答:handler封裝訊息的傳送(主要包含訊息傳送給誰)
2.Looper——訊息封裝的載體。(1)內部包含一個MessageQueue,所有的Handler傳送的訊息都走向這個訊息佇列;(2)Looper.Looper方法,就是一個死迴圈,不斷地從MessageQueue取訊息,如果有訊息就處理訊息,沒有訊息就阻塞。
3、MessageQueue,一個訊息佇列,新增訊息,處理訊息
4、handler內部與Looper關聯,handler->Looper->MessageQueue,handler傳送訊息就是向MessageQueue佇列傳送訊息。
總結:handler負責傳送訊息,Looper負責接收handler傳送的訊息,並把訊息回傳給handler自己。
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方法進行通知主執行緒。這樣做的好處比如有些圖片的載入啊,網路的訪問啊可能會比較耗時,所以放到子執行緒裡面做是比較合適的。