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