Handler訊息機制完全解析Handler解析

2021-09-11 09:21:53 字數 1778 閱讀 3711

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...