handler是如何處理訊息

2021-10-06 12:36:19 字數 2357 閱讀 6386

在handler機制中,同一執行緒中的多個handler是如何將訊息傳送給對應的handler物件去處理的呢?

let』s rtfsc!

先看看handler的使用:

class mainactivity :()

}.start()

}class handler1 :

handler()

}class handler2 :

handler()

}}

執行結果:

i/mainactivity: handler1 handlemessage

i/mainactivity: handler2 handlemessage

從上邊例子可以看出handler正確的將訊息傳送到了對應的handler物件,它是怎麼做到的呢?

從訊息傳送開始

public

final boolean sendemptymessage

(int what)

這裡間接呼叫sendemptymessagedelayed

public

final boolean sendemptymessagedelayed

(int what, long delaymillis)

//建立message物件

public static message obtain()

}return new message()

;}public

final boolean sendmessagedelayed

(@nonnull message msg, long delaymillis)

return

sendmessageattime

(msg, systemclock.

uptimemillis()

+ delaymillis);}

public boolean sendmessageattime

(@nonnull message msg, long uptimemillis)

return

enqueuemessage

(queue, msg, uptimemillis)

;}

上邊**中呼叫obtain建立了乙個新的message,設定what,延時0秒,又取當前執行緒looper中的messagequeue,並將message放到queue中,繼續看enqueuemessage方法:

private boolean enqueuemessage

(@nonnull messagequeue queue,

@nonnull message msg,

long uptimemillis)

return queue.

enqueuemessage

(msg, uptimemillis)

;}

上邊的**msg.target = this是關鍵,message的target是什麼?看看原始碼:

public

final

class message implements parcelable

target就是訊息傳送的目標handler,另外我們知道handler除了傳送message外,還負責處理message。所以我猜想,looper的loop方法取message後會交給message中的handler處理?於是乎,看看loop原始碼:

public static void loop()

final messagequeue queue = me.mqueue;

....

for(;;

)....try

catch

(exception exception)

finally

....

msg.

recycleunchecked()

;}}

這裡呼叫的是message中的handler的dispatch方法,並將msg當做引數傳入其中,繼續:

/**

* handle system messages here.

*/public void dispatchmessage

(@nonnull message msg)

else

}handlemessage

(msg);}

}

果然,處理message的就是message中的target物件,也就是傳送訊息的那個handler。

over~!

訊息佇列如何處理重複訊息

一 訊息重複現象 在 mqtt 協議中,給出了三種傳遞訊息時能夠提供的服務質量標準 at most once 最多一次,這種情況會丟失部分資料,一般日誌收集這種對資料不嚴格的可以使用 at least once 最少一次,這種會導致一條訊息重 送 exactly once 正好一次,一條訊息只會被消...

BizTalk Server 如何處理大訊息

什麼是大訊息?遺憾的是,此問題的答案不而直接與特定的訊息大小,繫結,取決於你的 microsoft 的特定瓶頸 biztalk server 系統。與大訊息關聯的問題可分為以下幾類 影響處理大訊息的因素 原始訊息大小 訊息格式以及訊息的處理型別都會影響 biztalk server 處理大訊息的方式...

Tomcat Server是如何處理http請求的

下面就讓我們簡單了解一下 tomcat server處理乙個http請求的過程 假設來自客戶的請求為 jsp1 請求被傳送到本機埠8080,被在那裡偵聽的coyote http 1.1 connector獲得 2 connector把該請求交給它所在的service的engine來處理,並等待來自e...