非同步訊息處理機制 Handler

2021-08-16 01:15:08 字數 2464 閱讀 5465

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