APP性能优化系列-异步优化与拓扑排序(二),移动开发者平台

本文介绍了如何优化APP启动时的异步任务,特别是使用拓扑排序解决任务间的依赖关系,以提高启动速度并确保执行顺序的正确性。通过自定义启动器和任务分类,实现并发、主线程执行和任务依赖的高效处理,避免低效的线程池和门栓方式。
摘要由CSDN通过智能技术生成

}

});

executorService.submit(new Runnable() {

@Override

public void run() {

initJPushInterface();

}

});

executorService.submit(new Runnable() {

@Override

public void run() {

initShareSDK();

}

});

try {

latch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

// Debug.stopMethodTracing();

}

这样就行了,只有当initBugly执行完毕才能继续跳转页面,当然值得补充的是,之所以要加门栓,是因为在onCreate方法里面,可能还有其他必须在主线程才能初始化的其他耗时任务,而initBugly可以不需要在主线程里面初始化,但是又必须得初始化完毕才能跳转页面。所以为了不再增加时间,才启动线程池+门栓去初始化

好了,既加快了速度,又可以保证一些不需要在主线程优化而又启动之前必须初始化完成的任务不出问题,

但是尼,这么写,有点Low,而且如果有的耗时方法存在关联,比如必须先执行完A,根据A的返回值,再执行B,然后根据B的返回再执行C,那么必须串联的话,我们该如何优化尼?

5.第三次改造(启动器)


先看图,目的就是进行任务分类

看了图,是不是略微明白了?我们的任务基本就是这样的,有的必须要在所以任务之前初始化,有的必须要在主线程初始化,有的可以有空在初始化,有的必须要在有的任务执行完毕再初始化,比如激光推送需要设备ID,那么就必须要在获取设备ID这个方法执行完才能执行,所以我们要对耗时任务先分类。

于是有了上图

  • head task : 我们会把一些必须先启动的task放到这里
  • 主线程:将必须要在主线程中初始化的task放入这里
  • 并发:将非必须在主线程中初始化的task放入这里
  • tall task: 一些在所有任务执行完毕之后才去初始化的放入这里,比如一些log打印等
  • ilde task: 通过字面就知道了将一些可以有空再初始化的task放入这里

好了分好类了之后,我们发现如果用常规的方式去做,比如线程池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值