有没有一种优雅的方法可以确定一个作业是否是当前艾德?我需要重新启动作业,但仅当作业延迟时,如下所示
fun restart() { if (job?.isDelayed()) job?.cancel() else return job = launch { repeat(10) { //do some heavy work delay(5000) } } }
icomxhvb1#
从作业文档中可以找到答案,作业没有延迟状态,作业有 * 新建 、 活动 、 完成 、 取消 、 已取消 、 已完成 * 几种状态,作业提供的状态流也在这些状态中流动。单从Job上似乎无法判断是否处于延迟状态,我们可以在类中单独设置delay标志,来改变delay函数调用前后的状态,以下是我的测试代码,希望能对大家有所帮助。
object Test { private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private var job: Job? = null private var delayFlag = false fun startJob() { if (job?.isActive == true) return job = scope. launch { repeat(10) { delayFlag = true delay(5000) delayFlag = false } } } fun restart() { if (job?.isActive == true && delayFlag) job?.cancel() else return println("restart job") job = scope. launch { repeat(10) { //do some heavy work delayFlag = true delay(5000) delayFlag = false } } } } fun main() = runBlocking { Test. startJob() repeat(5) { Test. restart() delay(20000L) } }
1条答案
按热度按时间icomxhvb1#
从作业文档中可以找到答案,作业没有延迟状态,作业有 * 新建 、 活动 、 完成 、 取消 、 已取消 、 已完成 * 几种状态,作业提供的状态流也在这些状态中流动。
单从Job上似乎无法判断是否处于延迟状态,我们可以在类中单独设置delay标志,来改变delay函数调用前后的状态,以下是我的测试代码,希望能对大家有所帮助。