在我们的程序中,经常会有序列的 *** 作流程集合,就像工厂的组装流程,先执行任务1,然后任务2,任务n…, 各个任务之间是有依赖关系的,比如,执行任务4之前,任务3和任务2要完成了才行。一个具体的例子,比如,app中的启动过程,一般包含权限检查,用户登录,引擎初始化等一系列的 *** 作,这些 *** 作有些可能有依赖关系,而且这些依赖关系随着需求的变化也可能发生变化,这里我们就可以使用下面介绍的 DepengdencyTask 任务依赖框架
框架特征- 框架可以检查任务的循环依赖
- 没有依赖关系的任务可以并发的执行(可以指定任务执行的Disaptacher)
- 一组任务执行器被调用多次,不会多次执行;只会从上一次执行失败的任务开始继续执行
- 如果任务执行器在运行期间,会检查状态,正在运行时,不会再执行一遍。
jitpack.io
https://jitpack.io
com.github.Arrowyi
DependencyTask
TheVersion
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方法收集执行过程中的状态
//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>?) : ProgressStatus()
//called if the task is done
class Progress(val task: Task) : ProgressStatus()
//called if all the tasks is done successfully, and the processor will be ended
class Complete : ProgressStatus()
//called if any of the task failed, and the processor will be ended immediately
class Failed(val failedTask: Task) : ProgressStatus()
//The Processor is already running, and this flow will be ended
class AlreadyRunning() : ProgressStatus()
例子
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
class SuspendTask : Task() {
override suspend fun doAction() {
//do suspend job
delay(100)
actionResult(true)
}
}
class BlockTask : Task() {
override suspend fun doAction() {
//some block job
Thread.sleep(100)
actionResult(true)
}
}
class SomeTask(private val name: String) : Task() {
override suspend fun doAction() {
actionResult(true)
}
override fun getTaskDescription(): String {
return name
}
}
fun main() = runBlocking {
val task1 = SuspendTask()
val task2 = BlockTask()
val task3 = SomeTask("task 3")
val task4 = SomeTask("task 4")
task2.addDependency(task1)
task3.addDependency(task1)
task3.addDependency(task2)
task4.addDependency(task3)
TaskProcessor(task1).start().collect() {
when (it) {
is Check -> println("check result is : ${it.result}")
is Progress -> println("task : ${it.task.getDescription()} is done")
is Complete -> println("all the task is done successfully,and the flow is ended")
is Failed -> println("task : ${it.failedTask.getDescription()} is failed , and the flow is ended ")
}
}
}
更多的使用方法可以参考项目中的测试用例
任务执行示例
如上示例,任务2和任务3将会并发地执行,任务7会在任务2和任务5执行完成后才执行,当所有任务都完成的时候,会收到complete消息,流程结束。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)