欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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的流程就完成了