外观
如何理解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 异步了,整个渲染流程就不占主线程。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q020