为什么MaterialAlertDialog测量自定义布局时远慢于Fragment?
自定义蓝牙遥控器项目的MaterialAlertDialog加载性能异常
项目背景
正在开发个人兴趣类自定义蓝牙遥控器项目,配套原生Android应用可完成遥控器参数配置,除下述性能问题外,其余功能运行均正常。
依赖版本配置
- Kotlin 1.4.30
- AndroidX AppCompat 1.3.0-beta01
- AndroidX ConstraintLayout 2.0.4
- AndroidX Fragment KTX 1.3.0
- Material Components 1.3.0
异常表现
- 搭载自定义布局、集成View Binding的MaterialAlertDialog首次弹出时,布局加载、测量、绘制的总耗时极长
- systrace录制结果显示,触发
MaterialAlertDialogBuilder逻辑后,UI线程会挂起1~2秒才完成下一帧渲染 - 后台有其他应用占用系统资源时,对话框首次弹出最高耗时可达1.7秒,远超Android 700ms的卡顿判定阈值,会触发
Davey!日志、掉帧、水波纹动画停滞等问题 - 对照组测试:将同一套自定义布局单独放入TestFragment中加载,systrace测得的布局加载、测量耗时仅为对话框场景的一半
已完成的实现与优化尝试
- 为保持Fragment代码整洁,封装了适配View Binding的MaterialAlertDialog Kotlin扩展函数,配套实现了对应的自定义布局XML、Fragment内的调用逻辑
- 已在项目中补充配置styles.xml、themes.xml的主题匹配项
- 尝试引入
AsyncLayoutInflater做异步布局加载优化,实际体验反而劣化:水波纹反馈动画可以完整执行,但对话框需要延迟1秒才正式展示,交互感受被严重割裂
核心待解问题
为什么AlertDialog场景下加载、测量同一自定义布局的速度,会远慢于Fragment承载同一布局的加载速度?
内容的提问来源于stack exchange,提问作者Thijs Koppen
相关产品推荐
相关产品推荐

