启动优化是一个大型软件开发中要做的第一步优化,因为无论你的APP做的内容有多么丰富,如果启动比较慢的话,那么给用户的第一印象就会非常不好。
想到异步首先想到的就是开线程,但是需要注意的是不要直接就去开线程,因为线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom,所以我们使用线程池的方式去执行异步。
对线程池不了解的就去看 大话线程池原理
3.第一次改造(FixedThreadPool)
这里我们采用 FixedThreadPool 来解决卡顿。但是问题来了, 这个线程池需要指定多少个线程合适尼?
有人会说,有几个方法就指定几个呗。。(突然想吐槽下,阿里里面曾经有个项目,就是这么做的,开的线程池就是按心情随便指定了个数字。。。其实是不对的,但咱人小势微的也不敢说啊)
为了更高效的利用CPU,尽量线程池数量不要写死,因为不同的手机厂商的CPU核数也是不一样的,设置的线程数过小的话,有的CPU是浪费的,设置过多的话,均抢占CUP,也会增加负担。所以正确的写法是:
// 获得当前CPU的核心数
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// 设置线程池的核心线程数2-4之间,但是取决于CPU核数
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
复制代码
实验证明,根据这个公式来算出的线程数是最合理的,至于为什么是这样算,不是全占用了CPU数是最好的吗?
表示不信作者的同学你就自己看下面的公式,欢迎来怼作者!
好了我们用线程池改造下
@Override
public void onCreate() {
super.onCreate();
// Debug.startMethodTracing(“MyApplication”);
ExecutorService executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
executorService.submit(new Runnable() {
@Override
public void run() {
initBugly();
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
initBaiduMap();
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
initJPushInterface();
}
});