Android启动优化之IdleHandler

学习自:https://juejin.im/post/5a6fd7b86fb9a01ca47ac6e8


假想网络很差的这样一个场景,我们非得等网络请求到位以后才更新UI的数据吗?一直给以一个waiting dialog必然极其影响用户体验。所以,我们需要显示预数据,可以是你预定义的默认数据,也可以是用户之前使用过的我们偷偷IO缓存下来的数据。

这证明了一个道理:我们需要在UI显示后,再进行耗时操作。(讲的比较牵强,不过就是这么个道理)


我们需要找到UI真正测绘完毕的时机,如果想深究UI测绘时机的源码,可以看

https://blog.csdn.net/qq_36523667/article/details/79671718

这里简单告诉你下结论:

在resume的过程中,我们的decor 会被添加到phone window中去

add后,view的测绘就会被调用


所以我们需要拿到这个被调用的时机。

在view被调用的过程中,一个msg会被抛出到looper中执行,在activity活动生命周期中,会不断有msg被抛出,来执行活动的生命周期。

我们有一个黑科技叫IdleHandler,他在所有looper中的msg被处理完后,能够得到回调。显然,这就是我们想要的东西。


所以正确做法:

@Override
protected void onResume() {
    super.onResume();
    Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
        @Override
        public boolean queueIdle() {
           //耗时操作
            return false;
        }
    });
}
返回false代表在这个IdleHandler被回调一次后就会被销毁。true代表可以一直被回调。

你可能感兴趣的:(启动优化)