【Android】Handler发送消息之后,消息是如何回到对应的handler处理的

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

 

你可能感兴趣的:(源码分析)