handler面試詳解
一、什麼是handler
handler通過傳送和處理
message
和runnable
物件來關聯對應執行緒的
messagequeue.
1. 可以讓對應的message和
runnable
在未來的某個時間點進行相應處理
2.讓自己想要處理的耗時操作放在子執行緒,讓更新
ui的操作放在主線程
ps.子執行緒不能開啟
handler
,因為訊息佇列預設繫結
ui執行緒
一、handle的使用方法
1.post(runnable)
2.sendmessage(message)
二、handler的機制原理
訊息機制主要包含:messagequeue,
handler
和looper
這三大部分,以及
message
,下面我們一一介紹。
**message:
**需要傳遞的訊息,可以傳遞資料;
**messagequeue:
**訊息佇列,但是它的內部實現並不是用的佇列,實際上是通過乙個單鏈表的資料結構來維護訊息列表,因為單鏈表在插入和刪除上比較有優勢。主要功能向訊息池投遞訊息
(messagequeue.enqueuemessage)
和取走訊息池的訊息
(messagequeue.next)
;**handler:
**訊息輔助類,主要功能向訊息池傳送各種訊息事件
(handler.sendmessage)
和處理相應訊息事件
(handler.handlemessage)
;**looper:
**不斷迴圈執行
(looper.loop)
,從messagequeue
中讀取訊息,按分發機制將訊息分發給目標處理者。
原始碼分析:
handler構造方法(有
looper
和messgequeue
初始化looper:looper中
preparemainlooper()
方法中的
prepare()
建立looper
設定threadlocal
,保證了每個執行緒的
looper
的維繫
開啟looper:looper的
loop()
方法(從
messagequeue
中死迴圈獲取訊息並處理訊息,
target
為handler
,dispatchmessage
來處理訊息)
總結:在子執行緒執行完耗時操作,當handler傳送訊息時,將會呼叫
messagequeue.enqueuemessage
,向訊息佇列中新增訊息。當通過
looper.loop
開啟迴圈後,會不斷地從執行緒池中讀取訊息,即呼叫
messagequeue.next
,然後呼叫目標
handler
(即傳送該訊息的
handler
)的dispatchmessage
方法傳遞訊息,然後返回到
handler
handler
收到訊息,呼叫
handlemessage
方法,接收訊息,處理訊息。
三、handler引起的記憶體洩漏以及解決辦法
原因:靜態內部類持有外部類的匿名引用,導致外部activity無法釋放
解決辦法:handler內部持有外部activity的弱引用,並把handler改為靜態內部類,mhandler.removecallback()
handler訊息處理機制
handler主要用來更新ui 因為涉及到執行緒安全,android必須在ui執行緒 即主線程 裡才能更新ui,在其他執行緒裡更新ui會報錯,而一些耗時的操作又必須通過開啟新的執行緒來執行,這就要用到handler來傳遞訊息了。在主線程中建立乙個handler的例項,並重寫handlermessag...
Handler訊息處理機制
剛開始接觸android,邊學習邊做筆記,希望大家多指正。經常在 中看到sendmessage 族的一些函式,開始時總搞不明白訊息傳送到 去了,誰去處理,什麼時候處理。下面是問題解答。至於開始的幾個疑問,我是這樣理解的。訊息傳送出去,就相當於馬上要被處理了。就像進地鐵一樣,已經站到了進站的佇列中 假...
非同步訊息處理機制
借鑑 為什麼不能在子執行緒更新ui?1 ui是非執行緒安全的,主線程和子執行緒同時更新ui的話會導致錯誤,如ui錯亂之類的。2 ui更新是很耗效能的,更別說為了執行緒安全加鎖了,最簡單的方法就是更新ui的操作放到乙個執行緒中,即主線程 handler機制 looper 維持乙個thread物件以及m...