问题是,我在哪里告诉我的线程使用 mHandler
循环者?
你不需要明确地告诉它,因为系统(框架)会为你做这件事。当你实例化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;
正如你所看到的,首先它获得了Looper
您当前的Thread
。的源代码Looper.myLooper()
如下:
public static final Looper myLooper() {
return (Looper)sThreadLocal.get();
}
它从线程本地存储中获取它。稍后,当您发送Message
有了这个Handler
, the Handler
实际上将自己设置为接受者 of the 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);
The dispatchMessage()
代码如下:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
注意last handleMessage(msg)
打电话——这正是你的handleMessage(msg)
覆盖!