Handler相關筆記

2021-08-21 01:14:28 字數 1831 閱讀 1048

1,  說說handler機制原理

handler的出現就是為了保證ui執行緒安全,對ui的修改只有ui執行緒可以操作,不允許其他執行緒操作,下面對handler非同步訊息處理機制再做一下簡單的介紹:

1、成員介紹

message:訊息,即執行緒間傳遞的物件,傳遞的資訊包含在其中。例如後台執行緒在處理資料完畢後需要更新ui,則可傳送一條包含更新資訊的message給ui執行緒。主要功能是進行訊息的封裝,同時可以指定訊息的操作形式;

looper:訊息迴圈幫浦,用來為乙個執行緒跑乙個訊息迴圈,扮演message queue和handler之間橋梁的角色,迴圈取出message queue裡面的message,並交付給相應的handler進行處理。每乙個執行緒最多隻可以擁有乙個。

messagequeue:訊息佇列,用來存放通過handler發布的訊息,按照先進先出執行。每乙個執行緒最多隻可以擁有乙個。

handler:訊息的處理者,handler 負責將需要傳遞的資訊封裝成message,傳送給looper,繼而由looper將message放入messagequeue中。當looper物件看到messagequeue中含有message,就將其廣播出去。該handler物件收到該訊息後,呼叫相應的handler 物件的handlemessage()方法對其進行處理。

2、同執行緒各成員的關係及數量

乙個執行緒中只有乙個looper,只有乙個messagequeue,可以有多個handler,多個messge;

②乙個looper只能維護唯一乙個messagequeue,可以接受多個handler發來的訊息;

③乙個message只能屬於唯一乙個handler;

④同乙個handler只能處理自己傳送給looper的那些message;

looper主要作用:

(1)      與當前執行緒繫結,保證乙個執行緒只會有乙個looper例項,同時乙個looper例項也只有乙個messagequeue。

(2)      loop()方法,不斷從messagequeue中去取訊息,交給訊息的target屬性的handler的dispatchmessage去處理。

3、handlerthread

(1)handlerthread本質上是乙個執行緒類,它繼承自thread,只不過其已經初始化內部looper,可以進行looper迴圈;

(2)通過獲取handlerthread的looper物件傳遞給handler物件,可以在handlemessage方法中執行非同步任務。

(3)例

handlerthread workhandlethread = new handlerthread("workhandlethread");

workhandlethread .start();

//在建立handler作為handlerthread執行緒訊息執行者的時候必須呼叫start方法之後,

//因為建立handler需要的looper引數是從handlerthread類中獲得,

//而looper物件的賦值又是在handlerthread的run方法中建立。

msubhandler = new handler(workhandlethread .getlooper(), msubcallback);

btn.setonclicklistener(new view.onclicklistener()

};looper.loop();

}}乙個執行緒沒有或只有乙個looper,乙個looper有乙個messagequeue,乙個執行緒可以有多個handler,handler屬於哪個執行緒取決於其looper變數,初始化時不傳入looper的話,其looper是該handler建立時所在的執行緒中threadlocalmap儲存的looper。

Handler相關筆記

一.handler的例項化 如果你不帶引數的例項化 handler handler new handler 那麼這個會預設用當前執行緒的looper 一般而言,如果你的handler是要來重新整理操作ui的,那麼就需要在主線程下跑。情況 1.要重新整理ui,handler要用到主線程的looper。...

Handler相關面試題

1.handler的作用 a 在非ui執行緒更新ui b 傳送延遲訊息 2.為什麼android設計只能ui執行緒更新ui?a 解決多執行緒併發問題 b 提高介面更新的效能問題 c 架構設計的簡單 3.handler相關的異常 a 只有主線程才能更新ui 解決辦法 向主線程傳送訊息,在主線程的han...

Handler原理核心點筆記

1.在looper中prepare 用於 建立乙個threadlocal物件,並存放乙個looper例項,並且prepare 方法只能代用一次,多次呼叫會出異常,所以乙個執行緒只有乙個looper物件,建立乙個messagequeque物件,用 於存放message。2.looper.loop 為乙...