详解Android创建Handler的必备知识点

 更新时间:2022年10月12日 11:32:09   作者:长安皈故里  
本篇文章主要介绍Handler中需要了解的几个必备知识点,比如Handler创建、异步Handler是个啥及如何创建,感兴趣的小伙伴快跟随小编一起学习一下

普通Handler创建

一般下面这样创建Handler时AS会进行告警:

删除线提示Handler的无参构造方法已经被@Deprecated标记,正确的做法都是使用带Looper构造参数的构造方法进行Handler的创建:

这样做的好处是直接指定消息调度在哪个Looper,而Looper是通过ThreadLocal和线程绑定在一起,也就是说,指明了Looper就能知道当前消息Message最终会在哪个线程中执行。

而之所以Handler无参构造方法被废弃的一个原因就是:

它会尝试从当前线程中的ThreadLocal获取Looper,主线程会自动帮助我们创建好Looper自然是没什么问题,但是如果子线程中执行Handler的创建,而没有手动调用Looper.prepare(),就会导致崩溃。

异步Handler的使用及创建

异步Handler有什么作用呢,相比较于普通Handler,可以获取优先调度执行权,当前,前提是要添加同步屏障消息。

这里解释下同步屏障消息:

同步屏障消息和普通的Message基本上没啥区别,主要的一个区分点是同步屏障消息Messagetarget属性为null,当从消息队列中取出消息并执行时,会先判断下当前的Messagetarget是否为null,如果为null则会从消息队列中优先获取异步消息 进行调度执行。

相应的源码如下:

添加消息屏障的方法为MessageQueue.postSyncBarrier(),不过这个方法目前是不支持业务方直接进行调用。

上面消息屏障说完了,我们接下来看下异步消息如何创建:异步消息的创建依赖异步Hanlder的创建。所以我们看下异步Handler如何进行创建:

@NonNull
public static Handler createAsync(@NonNull Looper looper) {
    if (looper == null) throw new NullPointerException("looper must not be null");
    return new Handler(looper, null, true);
}

@NonNull
public static Handler createAsync(@NonNull Looper looper, @NonNull Callback callback) {
    if (looper == null) throw new NullPointerException("looper must not be null");
    if (callback == null) throw new NullPointerException("callback must not be null");
    return new Handler(looper, callback, true);
}

Handler提供了createAsync()两个重载方法进行创建,最终会将HandlermAsynchronous属性置为true,然后通过Hanlder发送消息时,最终会走到Handler.enqueueMessage()方法:

private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
        long uptimeMillis) {
    ...
    if (mAsynchronous) {
        msg.setAsynchronous(true);
    }
    return queue.enqueueMessage(msg, uptimeMillis);
}

可以看到,如果mAsynchronous属性为true,就将Message添加FLAG_ASYNCHRONOUS置为异步消息。不过这个API是只有在SDK>=28以上才能调用,那么消息28的版本如何创建的,这里给出一个非常全面的兼容各个SDK版本的创建异步Handler的方法:

上面的使用讲完了,说下应用了。这个异步消息+消息屏障在系统源码中有一个非常典型的应用场景,那就是界面的绘制:

由于界面的绘制渲染优先级是比较高的,所以添加消息屏障后,将绘制相关的Message指定为异步方式,就可以优先进行执行。

到此这篇关于详解Android创建Handler的必备知识点的文章就介绍到这了,更多相关Android创建Handler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android 图片处理缩放功能

    Android 图片处理缩放功能

    这篇文章主要介绍了Android 图片处理缩放功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Android自定义柱状图表的方法实例

    Android自定义柱状图表的方法实例

    柱状图是我们在日常开发中经常会用到的一种图表,下面这篇文章主要给大家介绍了关于Android如何自定义柱状图表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-05-05
  • Android中使用Handler及Countdowntimer实现包含倒计时的闪屏页面

    Android中使用Handler及Countdowntimer实现包含倒计时的闪屏页面

    这篇文章主要介绍了Android中使用Handler及Countdowntimer实现包含倒计时的闪屏页面,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Android LineChart绘制折线图的示例详解

    Android LineChart绘制折线图的示例详解

    这篇文章主要为大家想想介绍了Android RecyclerLineChart实现绘制折线图的相关资料,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-03-03
  • so加载Linker跟NameSpace机制详解

    so加载Linker跟NameSpace机制详解

    这篇文章主要为大家介绍了so加载Linker跟NameSpace机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android DataBinding布局的加载深入探究

    Android DataBinding布局的加载深入探究

    看了谷歌官方文章确实写的太简略了,甚至看完之后有很多地方还不知道怎么回事儿或者怎么用,那么接下来我将通过文章全面介绍一下DataBinding布局的加载
    2022-11-11
  • Android控件WebView实现完整截图

    Android控件WebView实现完整截图

    这篇文章主要为大家详细介绍了Android控件WebView实现完整截图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android 获取 usb 权限的两种方法

    Android 获取 usb 权限的两种方法

    这篇文章主要介绍了Android 获取 usb 权限的两种方式,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Android动态添加设置布局与控件的方法

    Android动态添加设置布局与控件的方法

    这篇文章主要介绍了Android动态添加设置布局与控件的方法,涉及Android中布局与控件的相关操作技巧,需要的朋友可以参考下
    2016-01-01
  • Android利用Chronometer实现倒计时功能

    Android利用Chronometer实现倒计时功能

    这篇文章主要为大家详细介绍了Android利用Chronometer实现倒计时功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论