启动优化总结

很久以前有个项目进行了启动优化,当时自己弄了好久
现在拿出来看下,确实很简单,看了下网上的一些启动框架
确实没法比,不过很适合我们导航项目,记录下来,以后慢慢改进

1 大概思路:

在 Application的oncreate里差分成同步接口和异步接口以及异步等待接口,
在activity里可见的时候(onWindowFocusChanged)差分出个接口来执行不重要的加载

2 具体操作类:

public class BootTask extends BaseBootTask{

    private  static BootTask mInstance;

    public static BootTask getInstance() {
        if (mInstance == null) {
            mInstance = new BootTask();
        }
        return mInstance;
    }


    @Override
    void onApplicationSync(MyApp app) {
        //同步操作放这里
    }

    @Override
    public ArrayList onApplicationAsync() {
        //异步操作放这里
        return null;
    }

    @Override
    public ArrayList onWaitAsync() {
        //依赖账户路径的操作放这里
    }

    @Override
    void onAppVisibled(Activity activity) {
        //显示后慢慢加载的放这里
    }

}

看下它的基类,对异步放入了线程池,对依赖加了CountDownLatch:

public abstract class BaseBootTask {

    public static final String TAG = BaseBootTask.class.toString();
    //当前项目仅一处依赖(等待账户文件路径初始化)
    private CountDownLatch mCount = new CountDownLatch(1);
    protected ExecutorService threads;

    BaseBootTask() {
        threads = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    }

    abstract void onApplicationSync(MyApp app);

    //异步操作放这里
    public abstract ArrayList onApplicationAsync();

    //仅支持子线程等待,主线程不能被阻塞
    public abstract ArrayList onWaitAsync();

    //就是界面显示后的流程(onWindowFocusChanged)
    abstract void onAppVisibled(Activity activity);

    //等待完成的地方需要调用此接口释放 等待线程
    public void setCountDown() {
        mCount.countDown();
    }

    private void waitAsync() {

        try {
            mCount.await();
        } catch (InterruptedException e) {
        } finally {

        }
        
        for (Runnable r : onWaitAsync()) {
            threads.execute(r);
        }
    }

    private void applicationAsync() {

        for (Runnable r : onApplicationAsync()) {
            threads.execute(r);
        }

    }

}

然后就是将原来放在 applacation 以及activity oncreate,onstart,onresume 里面的代码移入对应的接口里面。

3 注意点:

applacation里面不重要的流程也可以移到 onAppVisibled 里面,不仅仅是 activity里面的接口

你可能感兴趣的:(常用知识点分类汇总,java,android)