用于收集将合并事务的 WindowContainer 的实用程序类。
例如,用于同步调整窗口容器的所有子项的大小
- 打开一个新的同步集,并传递将要调用的侦听器
int id startSyncSet(TransactionReadyListener)
返回的 ID 最终将与一组已就绪的 WindowContainer 一起传递给 TransactionReadyListener,这意味着已为这些 WindowContainer 调用了 onTransactionReady。您还可以使用它来在后续步骤中引用该操作。 - 要求每个子级参与:
addToSyncSet(int id, WindowContainer wc)
如果子级认为它将受到配置更改的影响(即在其子层次结构中有一个可见窗口,那么我们将增加预期回调的计数器
此时,容器层次结构将把未决事务和子层次结构更新重定向到同步引擎。 - 将配置更改应用到窗口容器。
- 告诉引擎同步集已准备就绪
setReady(int id) - 如果层次结构中没有任何子窗口需要等待,则立即调用 transactionReady,否则将触发所有窗口进行重绘并将缓冲区传送至 {@link WindowState#finishDrawing}。
一旦所有绘制完成,所有事务将合并并传送至 TransactionReadyListener。
这主要通过设置状态,然后观察/等待已注册的子树进入“完成”状态(通过接收绘制的内容或消失)来实现。这会在表面放置期间检查子树。默认情况下,所有同步都将被序列化(如果在一个同步处于活动状态时启动另一个同步,则会出现错误)。但是,可以明确以“并行”方式启动同步。这并不能保证它会并行运行;但是,只要其监视的层次结构不与任何其他同步的监视层次结构重叠,它就会并行运行。目前,以“并行”方式启动的同步会隐式忽略其直接成员下方的子树,除非这些成员是活动(WindowStates 被视为活动的“一部分”)。这允许“分层”并行,例如,仅在任务级别的同步可以与仅包含任务活动的另一个同步并行运行。如果在任何时候将容器添加到由另一个同步监视的并行同步中,它将被迫与其序列化。这是通过添加依赖项来完成的。同步只有在没有活动依赖项的情况下才会完成。此时它实际上不再是并行的。为了避免依赖循环,如果同步 B 最终依赖于同步 A,并且将容器添加到由 B 监视的 A,则该容器将从 B 移动到 A,而不是创建循环依赖项。
当同步重叠时,这将尝试按照启动顺序完成所有内容。