Android Material Date Picker加载慢,如何优化实现毫秒级启动?
Material Date Picker 加载速度优化方案
核心优化手段
- 提前预构建实例,不要在点击事件中才执行build逻辑
这是最直接的优化方式,在宿主Activity/Fragment的onCreate/onViewCreated生命周期就完成DatePicker的初始化,存储为成员变量,用户触发点击事件时直接调用show()即可,跳过耗时的实例构建流程:// 宿主类成员变量 private lateinit var startDatePicker: MaterialDatePicker<Long> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 提前初始化,不要放到点击回调里 startDatePicker = MaterialDatePicker.Builder.datePicker() .setTitleText("Start date") .setSelection(MaterialDatePicker.todayInUtcMilliseconds()) .build() // 点击事件里直接调用 startDateBtn.setOnClickListener { // 避免重复弹出 if (!startDatePicker.isAdded) { startDatePicker.show(childFragmentManager, "Start") } } } - 升级Material组件库版本
1.4.0及更早版本的Material Date Picker存在布局解析、日期计算逻辑冗余的问题,初始化耗时普遍在1s以上,升级到1.5.0及以上稳定版后,官方已经优化了大量初始化逻辑,默认加载速度可以提升80%以上。 - 避免不必要的配置项开销
- 不要在
Builder中执行耗时操作,比如查询本地存储读取历史选中日期,可提前将选中值缓存为变量再传入setSelection - 如无特殊需求,直接使用应用全局的MaterialComponents主题,不要给DatePicker单独设置复杂的自定义主题,减少主题解析开销
- 不要在
- 主线程空闲时预加载(可选)
如果担心提前初始化会占用主界面渲染的资源,可以放到IdleHandler中,等主线程空闲时再执行构建:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Looper.myQueue().addIdleHandler { startDatePicker = MaterialDatePicker.Builder.datePicker() .setTitleText("Start date") .setSelection(MaterialDatePicker.todayInUtcMilliseconds()) .build() // 只执行一次 false } }
内容的提问来源于stack exchange,提问作者shko
相关产品推荐
相关产品推荐

