安卓文档翻译—com.android.server.wm.BLASTSyncEngine

文档链接:https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/wm/BLASTSyncEngine.java

用于收集将合并事务的 WindowContainer 的实用程序类。
例如,用于同步调整窗口容器的所有子项的大小

  1. 打开一个新的同步集,并传递将要调用的侦听器
    int id startSyncSet(TransactionReadyListener)
    返回的 ID 最终将与一组已就绪的 WindowContainer 一起传递给 TransactionReadyListener,这意味着已为这些 WindowContainer 调用了 onTransactionReady。您还可以使用它来在后续步骤中引用该操作。
  2. 要求每个子级参与:
    addToSyncSet(int id, WindowContainer wc)
    如果子级认为它将受到配置更改的影响(即在其子层次结构中有一个可见窗口,那么我们将增加预期回调的计数器
    此时,容器层次结构将把未决事务和子层次结构更新重定向到同步引擎。
  3. 将配置更改应用到窗口容器。
  4. 告诉引擎同步集已准备就绪
    setReady(int id)
  5. 如果层次结构中没有任何子窗口需要等待,则立即调用 transactionReady,否则将触发所有窗口进行重绘并将缓冲区传送至 {@link WindowState#finishDrawing}。
    一旦所有绘制完成,所有事务将合并并传送至 TransactionReadyListener。

这主要通过设置状态,然后观察/等待已注册的子树进入“完成”状态(通过接收绘制的内容或消失)来实现。这会在表面放置期间检查子树。默认情况下,所有同步都将被序列化(如果在一个同步处于活动状态时启动另一个同步,则会出现错误)。但是,可以明确以“并行”方式启动同步。这并不能保证它会并行运行;但是,只要其监视的层次结构不与任何其他同步的监视层次结构重叠,它就会并行运行。目前,以“并行”方式启动的同步会隐式忽略其直接成员下方的子树,除非这些成员是活动(WindowStates 被视为活动的“一部分”)。这允许“分层”并行,例如,仅在任务级别的同步可以与仅包含任务活动的另一个同步并行运行。如果在任何时候将容器添加到由另一个同步监视的并行同步中,它将被迫与其序列化。这是通过添加依赖项来完成的。同步只有在没有活动依赖项的情况下才会完成。此时它实际上不再是并行的。为了避免依赖循环,如果同步 B 最终依赖于同步 A,并且将容器添加到由 B 监视的 A,则该容器将从 B 移动到 A,而不是创建循环依赖项。
当同步重叠时,这将尝试按照启动顺序完成所有内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值