問題是,我告訴我的線程使用mHandler作爲 Looper?
你不需要明確地告訴它,因爲系統(框架)爲你做。當您實例化Handler
時,它將自動獲得對當前Thread
的消息隊列的訪問權限。引用您的點評:
系統知道如何將消息發送到mHandler
Handler
?
我會在下面詳細說明。
這是android.os.Handler
構造在安卓
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
正如你所看到的,首先它獲得當前的Thread
的Looper
。的Looper.myLooper()
源代碼如下:
public static final Looper myLooper() {
return (Looper)sThreadLocal.get();
}
它獲得它從線程本地存儲。稍後,當您發送Message
與此Handler
時,Handler
實際上將其自身設置爲Message
的收件人:這是Looper
將知道何時在Message
到達時將其分派到哪裏。具體爲:
當你調用mHandler.sendMessage()
,最終運行此代碼(許多其他的代碼行中):
MessageQueue queue = mQueue;
boolean sent = false;
if (queue != null) {
msg.target = this; // msg is your Message instance
sent = queue.enqueueMessage(msg, uptimeMillis);
}
正如你所看到的,它設置Handler
實例爲Message
的目標。所以,稍後,當調度Message
時,它將包含Handler
作爲其目標。這是Looper
將知道應該將其分派給哪個Handler
。在細節,當你調用Looper.loop()
,下面會爲每個隊列您Message
實例:
msg.target.dispatchMessage(msg);
的dispatchMessage()
代碼如下:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
通知的最後handleMessage(msg)
電話 - - 這正是您的handleMessage(msg)
覆蓋!
就在完成所有必須在線程調用「處理程序」執行的任務之後......並執行處理程序中的線程操作之後必須執行的所有任務......! !!我是否達到了你的要求? –