Handler中Callback的作用

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

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()方法,该方法默认空实现,需要开发者在这里重写业务;

直观的逻辑流程图如下:


相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w