11package com.github.androidstartup
22
3+ import java.util.concurrent.CountDownLatch
4+
35/* *
46 ******************(^_^)***********************<br>
57 * User: fee(QQ/WeiXin:1176610771)<br>
68 * Date: 2022/11/13<br>
79 * Time: 20:14<br>
810 * <P>DESC:
9- *
11+ * 启动任务接口的抽象实现基类
1012 * </p>
1113 * ******************(^_^)***********************
1214 */
1315abstract class AStartupTask <T >: IStartupTask <T > {
16+ protected val mTag: String by lazy(LazyThreadSafetyMode .NONE ) {
17+ javaClass.simpleName
18+ }
19+
20+ /* *
21+ * 本启动任务所依赖的上游任务在完成后的 CountDown,当所有依赖的上游任务都完成后才通知本任务执行
22+ */
23+ protected val mDependentTaskCountDown by lazy(LazyThreadSafetyMode .NONE ){
24+ CountDownLatch (getDependentTaskCount())
25+ }
26+
1427 /* *
15- * 本启动任务所依赖的其他 task的数量
28+ * 本启动任务所依赖的其他启动任务的数量
29+ * 之所以增加这个属性,避免在调用[getDependentTaskCount]时每次都去调用[dependentTask]
30+ * 重复生成 List<>
31+ * def = -1,子类可以赋值,本父类默认会调用[dependentTask] 来查询一次
1632 */
17- override var dependenceTaskCount: Int
18- get() = dependentTask()?.size ? : 0
19- set(value) {}
33+ protected var mDependentTaskCount = - 1
34+
35+ /* *
36+ * 本启动任务所依赖的其他 task的数量,本任务所依赖的其他任务数量小于1时(即没有依赖其他任务)则优先执行
37+ */
38+ override fun getDependentTaskCount (): Int {
39+ if (mDependentTaskCount == - 1 ) {
40+ mDependentTaskCount = dependentTask()?.size ? : 0
41+ }
42+ return mDependentTaskCount
43+ }
2044
2145 /* *
2246 * 本启动任务所依赖的其他启动任务的 Class数据集
2347 * 作用为:在本启动任务执行前,需要在所依赖其他任务执行完后再执行
2448 */
25- override fun dependentTask (): List <Class <in IStartupTask <* >>>? {
49+ override fun dependentTask (): List <Class <out IStartupTask <* >>>? {
2650 return null
2751 }
52+
53+ // ----------------
54+ /* *
55+ * 标记当前启动任务先等一等
56+ */
57+ override fun letHoldOn () {
58+ try {
59+ mDependentTaskCountDown.await()
60+ }catch (ex: InterruptedException ){
61+ ex.printStackTrace()
62+ }
63+ }
64+
65+ /* *
66+ * 当当前任务的上游任务完成时通知当前任务将可以执行、动作
67+ */
68+ override fun letWillAction () {
69+ mDependentTaskCountDown.countDown()
70+ }
71+ // ----------------
2872}
0 commit comments