请谈谈什么是同步屏障?

更多面试题请看这里:https://interview.raoyunsoft.com/

面试题专栏会持续更新欢迎关注订阅

同步屏障是Android消息机制中的一种特殊控制手段,用于临时阻塞同步消息 ,优先处理异步高优先级消息(如UI绘制)。它的核心作用是确保关键任务不被普通消息延迟执行。


一、工作原理

  1. 设置屏障

    调用 handler.getLooper().getQueue().postSyncBarrier() 插入一个 target 为 null 的特殊消息(屏障消息):

    java 复制代码
    // 伪代码实现
    Message barrier = Message.obtain();
    barrier.when = SystemClock.uptimeMillis();
    mQueue.enqueueMessage(barrier); // 屏障入队
  2. 消息处理优先级

    Looper.loop() 执行 queue.next() 时:

    • 遇到屏障消息(target=null)时,跳过所有同步消息
    • 只处理标记为异步的消息(通过 msg.setAsynchronous(true)
  3. 屏障移除

    任务完成后需手动移除屏障:

    java 复制代码
    mQueue.removeSyncBarrier(token); // token是添加屏障时的返回值

二、关键特性

特性 同步消息 异步消息
标记方式 默认状态 msg.setAsynchronous(true)
屏障下的处理 被阻塞 优先执行
典型应用场景 普通业务逻辑 UI绘制、VSync信号响应

三、核心应用场景

View绘制流程 中保证优先级:

java 复制代码
// ViewRootImpl.java
void scheduleTraversals() {
    if (!mTraversalScheduled) {
        mTraversalScheduled = true;
        // 1. 插入同步屏障
        mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
        // 2. 发送异步绘制消息
        mChoreographer.postCallback(
            Choreographer.CALLBACK_TRAVERSAL, 
            mTraversalRunnable, 
            null
        );
    }
}

设计意图:避免用户输入事件(同步消息)阻塞16ms内的UI渲染(异步消息),防止掉帧。


四、底层机制解析

  1. 消息队列结构

    屏障消息如同"闸门",后续同步消息被拦截

  2. next() 关键逻辑

    java 复制代码
    Message next() {
        for (;;) {
            if (msg != null && msg.target == null) {
                // 发现屏障,寻找异步消息
                do {
                    prevMsg = msg;
                    msg = msg.next;
                } while (msg != null && !msg.isAsynchronous());
            }
            return msg; // 只返回异步消息
        }
    }

五、开发者注意事项

  1. 慎用场景

    仅限系统级高优先级任务(如渲染、动画),滥用会导致普通消息饥饿

  2. 屏障必须移除

    未移除的屏障会造成同步消息永久阻塞:

    java 复制代码
    // 在Traversals执行后移除
    void unscheduleTraversals() {
        mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
    }
  3. 替代方案

    现代开发推荐使用 Choreographer + Vsync 机制管理绘制时序,而非直接操作屏障。

相关推荐
weiggle16 小时前
第七篇:状态提升与单向数据流——架构设计的核心
android
JAVA96516 小时前
JAVA面试-JVM篇 03-JVM运行时数据区哪些是线程私有的哪些是共享的
java·jvm·面试
xingpanvip16 小时前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
goldenrolan16 小时前
A公司物料替代测试系统 v1.7:从需求到 exe/apk 的 AI 辅助全链路实践
android·自动化测试·软件测试·python·ai
AC赳赳老秦17 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
枫子有风18 小时前
LLM-Agent智能体(大厂面试常问)
面试·职场和发展·llm·agent
骇客之技术18 小时前
AutoLua:在安卓上写 Lua 脚本
android·junit·lua
kiros_wang19 小时前
Android 常见面试题
android
货拉拉技术20 小时前
Hook植入日志协助定位问题方案
android
FlightYe20 小时前
Android投屏MirrorCast全链路
android