【Android】Handler发送消息之后,消息是如何回到对应的handler处理的
程序员文章站
2022-03-08 11:52:56
...
1、我们都知道 handler通过Handler#sendMessage(Message)把Message发送到MessageQueue中,然后消息在Looper中又被发回到Handler处理。
那么Message是怎么找到对应的Handler的? (同一个Looper可以对应多个Handler)
2、先看Message的生成:
Handler#obtainMessage
public final Message obtainMessage(int what)
{
return Message.obtain(this, what);
}
Message#obtain
public static Message obtain(Handler h, int what, Object obj) {
Message m = obtain();
m.target = h;
m.what = what;
m.obj = obj;
return m;
}
从上面的代码可以看到,在生成Message的时候会把当前的handler赋值到Message的target字段。
3、再来看看Looper是如何处理消息的?
Looper#loop()
public static void loop() {
final Looper me = myLooper();
//简化部分代码
final MessageQueue queue = me.mQueue;
//简化部分代码
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
//简化部分代码
try {
msg.target.dispatchMessage(msg);
dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
//简化部分代码
msg.recycleUnchecked();
}
}
从上面的代码可以看到,loop中有个无限的for循环,不断的从MessageQueue 中Message,然后通过msg.target.dispatchMessage(msg)发回产生消息的Handler,msg.target就是产生Mesage的Handler。
至此,一个产生Message和消费Message的流程就完成了。