Handler异步消息与同步屏障(SyncBarrier)

本文介绍了Android中Handler的同步屏障(SyncBarrier)机制,用于处理异步消息,避免主线程因消息过多造成卡顿。同步屏障如同一堵墙,让异步消息优先处理,待处理完毕后再处理同步消息。文章讲解了如何使用MessageQueue的postSyncBarrier方法创建屏障,以及如何通过Message的setAsynchronous方法发送异步消息,并提到了在Android系统内部如ViewRootImpl.scheduleTraversals中的应用。
摘要由CSDN通过智能技术生成

前言

Android的消息机制之前有一篇文章有写,里面具体讲到了Handler怎么发送和处理消息的整个过程。感兴趣的同学可以先跳转过去看看 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)

在看消息机制的时候,不管是把消息加入队列,还是取出队列,Message有个isAsynchronous方法一直没关注,今天来看看这个方法到底是做什么的。

    /**
     * Returns true if the message is asynchronous, meaning that it is not
     * subject to {@link Looper} synchronization barriers.
     *
     * @return True if the message is asynchronous.
     *
     * @see #setAsynchronous(boolean)
     */
    public boolean isAsynchronous() {
   
        return (flags & FLAG_ASYNCHRONOUS) != 0;
    }

Handler同步屏障(SyncBarrier)

要理解这个方法的含义,我们要先了解一下Handler的同步屏障机制。通常我们使用Handler发消息的时候,都是用的默认的构造方法生成Handler,然后用send方法来发送消息,其实这时候我们发送的都是同步消息,发出去之后就会在消息队列里面排队处理。

我们都知道,Android系统16ms会刷新一次屏幕,如果主线程的消息过多,在16ms之内没有执行完,必然会造成卡顿或者掉帧。那怎么才能不排队,没有延时的处理呢?这个时候就需要异步消息,在处理异步消息的时候,我们就需要同步屏障,让异步消息不用排队等候处理。可以理解为同步屏障是一堵墙,把同步消息队列拦住,先处理异步消息,等异步消息处理完了,这堵墙就会取消,然后继续处理同步消息。

怎么来使用这个同步屏障呢?在MessageQueue里面有postSyncBarrier方法:

    public int postSyncBarrier() {
   
        return postSyncBarrier(SystemClock.uptimeMillis());
    }

    private int postSyncBarrier(long when) {
   
        // Enqueue a new sync barrier token.
        // We don't need to wake the queue because the purpose of a barrier is to stall it.
        synchronized (this) {
   
            final int token = mNextBarrierToken++;
            final Message msg = Message
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值