Android武林秘籍3——延迟加载的倚天剑和屠龙刀

延迟加载的目的是为了提高应用的启动速度,将消耗资源的操作放在页面显示之后进行,从而提高用户的使用体验。本文将带来延迟加载的两件大杀器:倚天剑和屠龙刀,有了它们延迟加载的问题便迎刃而解。

倚天剑:

首先 , 创建 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;    

    }  

});

怎么样,有了这两把利器,在以后的开发中是不是会更加得心应手呢?

你可能感兴趣的:(Android武林秘籍3——延迟加载的倚天剑和屠龙刀)