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