延迟加载的目的是为了提高应用的启动速度,将消耗资源的操作放在页面显示之后进行,从而提高用户的使用体验。本文将带来延迟加载的两件大杀器:倚天剑和屠龙刀,有了它们延迟加载的问题便迎刃而解。
倚天剑:
首先 , 创建 Handler 和 Runnable 对象, 其中 Runnable 对象的 run方法里面去更新 UI 线程.
private Handler myHandler = new Handler();
private Runnable mLoadingRunnable = new Runnable() {
@Override
public void run() {
updateText(); //更新UI线程
}
};
然后在Activity 的 onCreate 中加入下面的代码
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
myHandler.post(mLoadingRunnable);
}
});
其重点就在这个DecorVIew了,它是window中的最顶层view,也可以理解为Activity 的最下面的布局。当我们调用 DecorView 的 Post 的时候,其实最终会调用 View 的 Post ,因为 DecorView 最终是继承 View 的,当执行post的时候,如果view已经attach到activity时,那么就调用handler.post方法,否则把这个runnable存在特殊的一个队列里:runQueue,等到下一次performTraversals的时候执行(相当于在页面第一帧绘制完成后才去执行runnable里的东西,达到了延时的目的)。
屠龙刀:
利用IdleHandler延时操作提升性能:
使用场景:希望能够在当线程空闲做些准备工作,比如主线程在开始加载页面完成后,如果线程空闲就提前加载些二级页面的内容。对于这种情况下,可以考虑使用MessageQueue.IdleHandler来实现。
具体的实现方式:
getMainLooper().myQueue().addIdleHandler(new ThreadIdleHander())
其中:
class ThreadIdleHander implements MessageQueue.IdleHandler {
@Override
public boolean queueIdle() {
// do something ...
return false;
}
}
getMainLooper是获得当前主线程的Looper,然后在其中的MessageQueue中加入一个IdleHandler.当线程空闲时,就会去调用queueIdle()函数,如果返回值为True,那么后续空闲时会继续的调用此函数,否则不再调用;
loop每次从MessageQueue取出一个Message,如果当前队列中没有任何消息的时,就去查找是否注册了IdleHandler的回调,如果有的话,则每个的执行,逻辑很简单。
最后另一种直接匿名类的写法也是可以的:
Looper.myQueue().addIdleHandler(new IdleHandler() {
@Override
public boolean queueIdle() {
// TODO Auto-generated method stub
//你想做的任何事情
//........
return false;
}
});
怎么样,有了这两把利器,在以后的开发中是不是会更加得心应手呢?