Android-Handler機制詳解

Handler

一、handler是什麼?
答:handler是更新UI界面的機制,也是消息處理的機制,咱們能夠發送消息,也能夠處理消息
 
二、爲何要有Handler?
答:Android在設計的時候,封裝了一套消息建立、傳遞、處理機制,若是不遵循這樣的機制就沒辦法更新UI信息,就會拋出異常。
 
三、handler怎麼用?
答:一、post(Runnable);
       二、postDelayed(Runnable ,long);
       三、sentMessage
       四、sentMessageDelayed
 
四、Android爲何要設置只能經過Handler機制更新UI?
答:最根本的問題解決多線程併發的問題;
      假設若是在一個Activity中,有多個線程去更新UI,而且都沒有加鎖機制,馬麼會產生生麼樣的問題?——更新界面混亂;
      若是對更新UI 的操做都加鎖處理的話會產生什麼樣子的問題?——性能降低
      對於上述問題的考慮,Android提供了一套更新UI的機制,咱們只須要遵循這樣的機制就行了。
      不用關心多線程的問題,更新UI的操做,都是在主線程的消息隊列當中輪詢處理的。
 
五、handler的原理是什麼?
答:一、handler封裝消息的發送(主要包括消息發送給誰)
      二、Looper——消息封裝的載體。(1)內部包含一個MessageQueue,全部的Handler發送的消息都走向這個消息隊列;(2)Looper.Looper方法,就是一個死循環,不斷地從MessageQueue取消息,若是有消息就處理消息,沒有消息就阻塞。
      三、MessageQueue,一個消息隊列,添加消息,處理消息
      四、handler內部與Looper關聯,handler->Looper->MessageQueue,handler發送消息就是向MessageQueue隊列發送消息。
     總結:handler負責發送消息,Looper負責接收handler發送的消息,並把消息回傳給handler本身。
              MessageQueue存儲消息的容器。
 
六、HandlerThread的做用是什麼?
答: HandlerThread  thread = new HandlerThread( "handler thread" );自動含等待機制,等Looper建立好了,才建立Handler,避免出現空指針異常。
 
七、主線程
* ActivityThread 默認建立main線程,main中默認建立Looper,Looper默認建立MessageQueue
* threadLocal保存線程的變量信息,方法包括:set,get
 
八、Android更新UI的方式?
答:一、runOnUIThread
   二、handler post
   三、handler sendMessage
   四、view post
 
九、非UI線程真的不能更新UI嗎?
答:不必定,之因此子線程不能更新界面,是由於Android在線程的方法裏面採用checkThread進行判斷是不是主線程,而這個方法是在ViewRootImpl中的,這個類是在onResume裏面才生成的,所以,若是這個時候子線程在onCreate方法裏面生成更新UI,並且沒有作阻塞,就是耗時多的操做,仍是能夠更新UI的。
 
十、使用Handler遇到的問題?
答:好比說子線程更新UI,是由於觸發了checkThread方法檢查是否在主線程更新UI,還有就是子線程中沒有Looper,這個緣由是由於Handler的機制引發的,由於Handler發送Message的時候,須要將Message放到MessageQueue裏面,而這個時候若是沒有Looper的話,就沒法循環輸出MessageQueue了,這個時候就會報Looper爲空的錯誤。
 
十一、主線程怎麼通知子線程?
答:能夠利用HandlerThread進行生成一個子線程的Handler,而且實現handlerMessage方法,而後在主線程裏面也生成一個Handler,而後經過調用sendMessage方法進行通知子線程。一樣,子線程裏面也能夠調用sendMessage方法進行通知主線程。這樣作的好處好比有些圖片的加載啊,網絡的訪問啊可能會比較耗時,因此放到子線程裏面作是比較合適的。
相關文章
相關標籤/搜索