DependencyTask 任务依赖框架
背景
在我们的程序中,经常会有序列的操作流程集合,就像工厂的组装流程,先执行任务1,然后任务2,任务n…, 各个任务之间是有依赖关系的,比如,执行任务4之前,任务3和任务2要完成了才行。一个具体的例子,比如,app中的启动过程,一般包含权限检查,用户登录,引擎初始化等一系列的操作,这些操作有些可能有依赖关系,而且这些依赖关系随着需求的变化也可能发生变化,这里我们就可以使用下面介绍的 DepengdencyTask 任务依赖框架
这个一个用Kotlin编写的基于协程并发的轻巧框架
框架特征
- 框架可以检查任务的循环依赖
- 没有依赖关系的任务可以并发地执行(可以指定任务执行的Disaptacher)
- 同一个任务执行器被调用多次,不会多次执行;只会从上一次执行失败的任务开始继续执行
- 如果任务执行器在运行期间,会检查状态,正在运行时,不会再执行任务。
引用
maven
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.Arrowyi</groupId>
<artifactId>DependencyTask</artifactId>
<version>TheVersion</version>
</dependency>
gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.Arrowyi:DependencyTask:TheVersion'
}
用法介绍
- 先把自己的流程梳理清楚,分成若干任务 (可以有依赖)
- 继承Task类,编写自己的任务类
- 实现任务类的action方法。action方法为suspend 方法,可以任意的coroutine中运行,注意:无论action方法的结果如果,都需要调用actionRersult方法通知框架任务处理结束
- 创建TaskProcessor执行器,调用start方法获取一个Flow
- 调用Flow的 collect方法开始执行操作流程,colloct方法收集执行过程中的状态
Flow 的状态类
//check if there is circular dependency , true is for check ok (no circular dependency), false will end the processor, and the tasks is all
//the tasks this processor will do.
class Check(val result: Boolean, val tasks: List<Task>?) :