Android 启动优化(四)- AnchorTask 是怎么实现的,android音视频开发何俊林pdf

  1. 当前任务执行完毕之后,所有依赖它的子任务需要感知到。我们可以用一个 map 来存储这种关系,key 是当前任务,value 是依赖于当前任务的集合(list)

  2. 多线程当中,等待和唤醒功能,有多种方式可以实现。wait、notify 机制,ReentrantLock Condition 机制,CountDownLatch 机制。这里我们选择 CountDownLatch 机制,因为 CountDownLatch 有点类似于计数器,特别适合这种场景。

具体实现


IAnchorTask

首先,我们定义一个 IAnchorTask 接口,主要有一个方法

  • isRunOnMainThread(): Boolean 表示是否在主线程运行,默认值是 false

  • priority(): Int 方法 表示线程的优先级别,默认值是 Process.THREAD_PRIORITY_FOREGROUND

  • needWait() 表示当我们调用 AnchorTaskDispatcher await 时,是否需要等待,return true,表示需要等待改任务执行结束,AnchorTaskDispatcher await 方法才能继续往下执行。

  • fun getDependsTaskList(): List<class&gt;?</class 方法返回前置任务依赖,默认值是返回 null.

  • fun run() 方法,表示任务执行的时候

1interface IAnchorTask : IAnchorCallBack {

2

3    /**

4     * 是否在主线程执行

5     */

6    fun isRunOnMainThread(): Boolean

7

8    /**

9     * 任务优先级别

10     */

11    @IntRange(

12        from = Process.THREAD_PRIORITY_FOREGROUND.toLong(),

13        to = Process.THREAD_PRIORITY_LOWEST.toLong()

14    )

15    fun priority(): Int

16

17    /**

18     * 调用 await 方法,是否需要等待改任务执行完成

19     * true 不需要

20     * false 需要

21     */

22    fun needWait(): Boolean

23

24    /**

25     * 当前任务的前置任务,可以用来确定顶点的入度

26     */

27    fun getDependsTaskList(): List<Class>?

28

29    /**

30     * 任务被执行的时候回调

31     */

32    fun run()

33

34}

它有一个实现类 AnchorTask,增加了 await 和 countdown 方法

  • await 方法,调用它,当前任务会等待

  • countdown() 方法,如果当前计数器值 > 0,会减一,否则,什么也不操作

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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值