Handler中Callback的作用

QuibblerQuibbler 2021-01-11 约 5 分钟 2088 次阅读

Handler中Callback的作用

通常创建Handler的时候为了能够让Handler处理我们发送的Message,往往开发者选择通过匿名类重写handleMessage()方法

Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            //handler this message
        }
    };

源码中注释也提到,这是留给开发者的一种思路:

/**
     * Subclasses must implement this to receive messages.
     */
    public void handleMessage(@NonNull Message msg) {
    }

在创建Handler的几种方法一文中,会发现构造方法中有一个参数是Callback,其实是框架定义的一个接口。在实例化Handler时可以作为参数使用。

/**
     * Callback interface you can use when instantiating a Handler to avoid
     * having to implement your own subclass of Handler.
     */
    public interface Callback {
        /**
         * @param msg A {@link android.os.Message Message} object
         * @return True if no further handling is desired
         */
        boolean handleMessage(@NonNull Message msg);
    }

在Handler、Looper、MessageQueue消息机制原理一文中,我们知道在Looper中loop()方法中循环的时候,会将消息发送会Handler处理:

try {
        msg.target.dispatchMessage(msg);
    }

dispatchMessage(msg)消息分发方法实现如下:

/**
     * Handle system messages here.
     */
    public void dispatchMessage(@NonNull Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

如果Message自带callback,也就是Runnable任务那么直接执行该任务,执行完返回;

否则,如果Handler中的mCallback不为空,先执行Callback处理逻辑。如果Callback返回true那么直接返回,不会回调handleMessage()方法;否则还会执行handleMessage()方法;

如果mCallback为null,那么执行handleMessage()方法,该方法默认空实现,需要开发者在这里重写业务;

直观的逻辑流程图如下:


相关推荐