Android 启动优化
对与Android的项目来说,app的启动速度是非常重要的。因为用户打开你的app给别人的第一体验就是打开软件的速度。但是app的启动速度是比较难以缩短的,因为一般来说开发者在app的启动入口都会创建一些比较耗时的操作,比方说使用SharedPreferences,初始化一些第三方的类库还有进行网络请求的判断。关于启动的优化可以分为两个方向来进行。第一:使用多线程充分利用好cup的运行效率提高运行时的速度;第二:使用延迟加载的方式将不重要的一些耗时的操作放到界面显示之后在做。
第一点使用异步方法加快启动时的速度。首先还是重写Application方法在onCreate方法里面初始化,然后建立一个手机核数对于的线程池,在线程池里面异步的加载耗时的操作。这样就可以进行异步的加载方式
//手机的核数 final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); final int CORE_POOL_SIZE = Math.max(2,Math.min(CPU_COUNT-1,4)); //优化启动方式 //异步方式创建线程池 ExecutorService service = Executors.newFixedThreadPool(CORE_POOL_SIZE); //将初始化操作放到线程池里面去 service.submit(new Runnable() { @Override public void run() { initA(); } }); service.submit(new Runnable() { @Override public void run() { initB(); } }); service.submit(new Runnable() { @Override public void run() { initC(); } });
但是这样的加载方式还是存在者问题,由于这些都是异步加载的内容所有不知道这些初始化到底什么时候完成,所以可能还是需要进行一些处理。比方说我们的App一开始就需要这个初始化的数据但是在主线程调用的时候并没有初始化完,在这个时候就可能产生异常,有的必须在Application里面初始化成功才有作用。所以可以使用CountDownLatch。
首先初始化一个CountDownLatch后,在异步进程的最后调用await方法等待里面的进程countDown,这样就可以保证我们想要的进程一定可以执行完
private CountDownLatch mCountDownLatch = new CountDownLatch(1);
mCountDownLatch.countDown();
mCountDownLatch.await();
private CountDownLatch mCountDownLatch = new CountDownLatch(1); //手机的核数 final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); final int CORE_POOL_SIZE = Math.max(2,Math.min(CPU_COUNT-1,4)); onCreate里面的方法 //异步方式创建线程池 ExecutorService service = Executors.newFixedThreadPool(CORE_POOL_SIZE); //将初始化操作放到线程池里面去 service.submit(new Runnable() { @Override public void run() { //初始化的方法 initA(); mCountDownLatch.countDown(); } }); service.submit(new Runnable() { @Override public void run() { initB(); } }); service.submit(new Runnable() { @Override public void run() { initC(); } }); try { //等待完成之后就会完成的 mCountDownLatch.await(); }catch (Exception e){ e.printStackTrace(); }
如上面的代码所示除非initA方法执行完毕之后才会继续向下执行。
第二点使用延迟加载的方式将不重要的一些耗时的操作放到界面显示之后在做
我们可以先观察把一些一开始非必要的内容在MainActivity显示后进行初始化,在界面成功显示之后使用Handler进行延迟的初始化。
new Handler().postDelayed(new Runnable(){
public void run() {
//进行初始化
}
}, 2000);