Skip to content
阅读进度

如何理解AsyncLayoutInflater 的线程限制? ​

返回 性能与稳定性 目录

标准回答 ​

不能。布局的父容器生成 LayoutParams 的过程要允许跨线程,所创建的 View 不能在构造时依赖当前线程的 Looper 或创建不合适的 Handler。无法在后台创建时,库会回退到 UI 线程,因此需要验证真正异步成功的比例。

创建 inflater 和发起 inflate 应遵循 UI 线程契约;结果默认不自动 attach 到父容器。默认回调在 UI 线程,1.1.0 起有指定回调 Executor 的重载,使用时不能假设一定回主线程。addView、数据绑定和后续 View 树操作仍要满足对应 UI 线程约束。

还要核查自定义工厂、AppCompat 控件和 fragment 布局兼容性。异步 Inflate 主要转移创建工作,并没有自动消除主线程的 measure、layout 和 draw。

追问与回答 ​

布局没来得及创建完,页面已销毁怎么办 ​

回调中检查当前生命周期和请求版本,拒绝把旧布局添加到新页面;同时避免长时间持有旧 Activity。

主线程时间减少,总启动时间就一定减少吗 ​

如果首屏仍必须等该布局,而后台排队或资源竞争更严重,总时间可能不降。要分析关键路径。

易混淆点 ​

  • 任何 LayoutInflater 都可以随便放到线程池调用。
  • inflate 异步了,整个渲染流程就不占主线程。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。