消息处理机制之消息处理

要分析消息处理的流程,我们需要从Looper类的loop方法开始。

frameworks/base/core/java/android/os/Looper.java

public static void loop() {
        final Looper me = myLooper();
        final MessageQueue queue = me.mQueue;

        for (;;) {
            Message msg = queue.next(); // might block
            .....

            final long dispatchStart = needStartTime ? SystemClock.uptimeMillis() : 0;
            final long dispatchEnd;
            try {
                msg.target.dispatchMessage(msg);
                dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
            } finally {

            }
            .....

            msg.recycleUnchecked();
        }
    }

在looper中调用queue.next方法,当没有消息需要处理时,就会进入休眠状态,直到有新消息需要处理才会继续执行,调用Message对象msg的成员变量target来处理。target是一个Handler对象,接下来就会调用dispatchMessage的实现。

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

dispatchMessage按以下顺序来分发消息。

  1. 如果在发送消息时指定了一个回调接口,那么msg.callback != null为true就会调用Handler类的成员函数handleCallback来处理消息。
  2. 如果不满足条件1,并且指定了一个Callback回调接口,那么就会调用回调接口的handleMessage方法来处理消息。
  3. 如果不满足2,且Callback回调接口handleMessage没有处理消息,就会向下调用Handler类的成员函数handleMessage处理这个消息。
private static void handleCallback(Message message) {
    message.callback.run();
}

message的callback变量是一个Runnable对象,将消息交给Runnable的成员函数run来处理。

public final boolean post(Runnable r){
       return  sendMessageDelayed(getPostMessage(r), 0);
}
    
private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callback = r;
    return m;
}

在发送消息时会调用类似post的方法,post方法会调用getPostMessage方法将Runnable封装到一个Message对象中,最终消息有Runnable的run方法处理。

public interface Callback {
    public boolean handleMessage(Message msg);
}

public Handler(Callback callback) {
        this(callback, false);
    }

Callback接口只有一个成员函数handleMessage来处理消息。在创建Handler实例时需要一个传递一个实现了Callback接口的实例

public void handleMessage(Message msg) {
 }

handleMessage是Handler类的一个空实现。一般情况下我们都会继承Handler类并在子类中重写handleMessage方法,这样就可以有子类来对消息进行处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章