handler
handler總是依附於建立時所在的執行緒,比如我們的handler是在主線程中建立的,而在子執行緒中又無法直接對ui進行操作,於是我們就通過一系列的傳送訊息、入隊、出隊等環節,最後呼叫到了handler的handlemessage()方法中,這時的handlemessage()方法已經是在主線程中執行的,因而我們當然可以在這裡進行ui操作了。整個非同步訊息處理流程的示意圖如下圖所示:
非同步訊息處理流程
handler
這便是我們平時直接使用的主角。繼承handler
重寫其handlemessage()
方法來處理訊息,在需要的時候呼叫sendmessage()
來發訊息,剩下的就不用管了。現在來看看「我們不用管」的這部分都幹了點啥。
構造方法
所有的構造方法最終會會呼叫兩個實現,如果制定了looper,則會呼叫三個引數的過載,否則會呼叫兩個引數的過載。而後者則會呼叫lopper.mylooper()
來獲取looper。兩個構造方法除了給mlooper
賦值外,還給mqueue
賦值為mlooper.mqueue
;給mcallback
賦值為指定的callback或null;給masynchronous
賦值為指定的boolean或false。 在兩個引數的構造方法中,給上述四個成員賦值前有段if(find_potential_leaks){}
包裹的**段,該變數定義為private static final boolean find_potential_leaks = false;
因此推斷這部分是開發時除錯用的,此處不做理會。
建立訊息obtainmessage()
根據原始碼可以看出,所有該方法的過載都呼叫了message.obtain()
對應的過載,可以看message.obtain()的來龍去脈來了解,此處不再贅述。需要注意的是,每個過載都傳入了this
引數並賦值給了message的target
。這裡先記著就行,後面會介紹如何通過target
呼叫dispatchmessage()
處理訊息。
傳送訊息sendmessage()
所有的sendemptymessage()
過載與sendmessage***()
以及post***()
最終都會呼叫enqueuemessage()
方法,該方法則呼叫queue.enqueuemessage()
方法將訊息新增到訊息佇列。關於訊息佇列如何管理訊息可以看messagequeue的佇列管理一文。
移除訊息removemessage()
所有的removemessages()
過載與removecallbacks()
過載最終都是呼叫mqueue.removemessages()
方法,即通過messagequeue來實現該操作。詳細分析可以看messagequeue的佇列管理一文。
處理訊息dispatchmessage()
訊息處理最開始被呼叫的不是handle***()
方法,而是dispatchmessage()
方法。該方法會根據訊息是否有callback
來判斷該交給handlecallback()
還是handlemessage()
。前者直接呼叫引數中message
的message.calback.run()
解決問題,後者則是空方法體,需要我們開發者自己重寫。
handler一些特點
handler例項
技術+職場
Handler訊息機制
android的訊息機制主要是指handler的執行機制,也就是handler message messagequeue looper threadlocal之間的工作過程。handler 主要用於傳送和處理訊息。messagequeue 訊息佇列,主要用於存放所有通過handler傳送的messa...
Handler訊息傳遞機制
使用方法 1.若在ui主線程中,則系統已經初始化了乙個looper物件 因為主線程也是乙個訊息迴圈,因此具有乙個looper,主線程的所有工作都是由其looper完成的looper不斷從訊息佇列中抓取訊息,然後完成訊息指定的任務 否則要自己建立乙個looper物件並啟動。我們無法通過構造器建立loo...
Handler訊息傳遞機制
android中ui並不是執行緒安全的,什麼是執行緒安全呢 這是維基給出的解釋。如果有多個執行緒操作ui,會造成執行緒不安全問題。因此android有規定 ui元件只能在activity中對ui進行操作。當乙個程式第一次啟動時,android會同時啟動乙個main thread 主線程 主要負責與u...