问题是,我在哪里告诉我的线程将 mHandler 用于 Looper?
您不需要明确地告诉它,因为系统(框架)会为您完成。当你实例化 时Handler
,它会自动获得对你当前消息队列的访问权Thread
。引用您的评论:
系统如何知道将消息发送到mHandler
Handler
?
我将在下面详细说明。
这是android.os.Handler
Android中的构造函数:
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
稍后,当您使用 this发送 a时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)
覆盖!