Android 启动优化(四)- AnchorTask 是怎么实现的(1)

1abstract class AnchorTask : IAnchorTask {

2

3    private val countDownLatch: CountDownLatch = CountDownLatch(getListSize())

4    private fun getListSize() = getDependsTaskList()?.size ?: 0

5

6    companion object {

7        const val TAG = “AnchorTask”

8    }

9

10    /**

11     * self call,await

12     */

13    fun await() {

14        countDownLatch.await()

15    }

16

17    /**

18     * parent call, countDown

19     */

20    fun countdown() {

21        countDownLatch.countDown()

22    }

23}

排序实现

无环图的拓扑排序,这里采用的是 BFS 算法。具体的可以见 AnchorTaskUtils#getSortResult 方法,它有三个参数

  • list 存储所有的任务

  • taskMap: MutableMap<class, AnchorTask&gt; = HashMap()</class存储所有的任务,key 是 Class

,value 是 AnchorTask

  • taskChildMap: MutableMap<class, ArrayList<class&gt;?&gt; =<br /> HashMap()</class</class,储存当前任务的子任务, key 是当前任务的 class,value 是 AnchorTask 的 list

算法思想

  1. 首先找出所有入度为 0 的队列,用 queue 变量存储

  2. 当队列不为空,进行循环判断。

  • 从队列 pop 出,添加到结果队列

  • 遍历当前任务的子任务,通知他们的入度减一(其实是遍历 taskChildMap),如果入度为 0,添加到队列 queue 里面

  • 当结果队列和 list size 不相等试,证明有环

1    @JvmStatic

2    fun getSortResult(

3        list: MutableList, taskMap: MutableMap<Class, AnchorTask>,

4        taskChildMap: MutableMap<Class, ArrayList<Class>?>

5    ): MutableList {

6        val result = ArrayList()

7        // 入度为 0 的队列

8        val queue = ArrayDeque()

9        val taskIntegerHashMap = HashMap<Class, Int>()

10

11        // 建立每个 task 的入度关系

12        list.forEach { anchorTask: AnchorTask ->

13            val clz = anchorTask.javaClass

14            if (taskIntegerHashMap.containsKey(clz)) {

15                throw AnchorTaskException(“anchorTask is repeat, anchorTask is  a n c h o r T a s k ,   l i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值