我們先從最熟悉也是最基本的方法sendMessage(Message msg)來查看,為什么說它是最基本的方法,因?yàn)槠渌l(fā)送方法無論是post開頭的各種方法還是sendEmptyMessage()本質(zhì)上都是內(nèi)部幫我們創(chuàng)建了Message對(duì)象,再調(diào)用sendMessage(Message msg)來執(zhí)行的。
當(dāng)然說它是最基本的方法也不完全正確,因?yàn)樗鼘?shí)際上是調(diào)用了delayMillis為0時(shí)的sendMessageDelayed(Message msg, long delayMillis)方法。然后依次調(diào)用sendMessageAtTime(@NonNull Message msg, long uptimeMillis)悴灵,enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg, long uptimeMillis)
Message有同步和異步的區(qū)別(默認(rèn)同步)
handler dispathMessage()方法(runnable,callback 骂蓖,Message的優(yōu)先級(jí))
dispatchMessage() 是Looper在loop()循環(huán)中執(zhí)行調(diào)用handler處理具體操作的方法积瞒,方法很簡單如下:
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
代碼中的幾個(gè)條件語句決定了各個(gè)處理方法的優(yōu)先級(jí),比如Message.callback不為空時(shí)優(yōu)先且只執(zhí)行Message的callback方法登下,這種情況很常見茫孔,即調(diào)用Handler的post(Runnable r),它會(huì)將第一個(gè)參數(shù)runnable封裝成一個(gè)Message對(duì)象并將runnable賦值給Message.callback被芳。
這也很符合人的直觀感受缰贝,我們當(dāng)然是想執(zhí)行該runnable方法,至于Handler的handleMessage(Message msg)方法肯定是不想讓它執(zhí)行的畔濒,畢竟從post方法的直觀調(diào)用上來看我們甚至不知道發(fā)送了一個(gè)Message到隊(duì)列中剩晴。
執(zhí)行Message.callback的情況也只有這么一種,因?yàn)镸essage的callback是@UnsupportedAppUsage的無法被我們調(diào)用賦值。
然后接下來我們看到還有兩處處理具體操作的分別是:mCallback.handleMessage(msg)和handleMessage(msg)赞弥,邏輯上很簡單毅整,優(yōu)先執(zhí)行mCallback的handleMessage(msg)方法,再根據(jù)其返回值決定是否執(zhí)行Handler本身的handleMessage(msg)方法绽左。mCallback是Handler的變量悼嫉,我們對(duì)其進(jìn)行賦值的方法只有創(chuàng)建對(duì)象時(shí)通過構(gòu)造方法的參數(shù)進(jìn)行復(fù)制,而handleMessage(msg)大家很熟悉了拼窥,繼承Handler時(shí)通過重寫實(shí)現(xiàn)自己的handleMessage(msg)戏蔑。