对于可被取消的协程和不可被取消的协程。
https://www.kotlincn.net/docs/reference/coroutines/cancellation-and-timeouts.html
这里给了两个例子
可被取消的协程:
fun main() = runBlocking {
//sampleStart
val job = launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
//sampleEnd
}
不可被取消的协程:
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nextPrintTime = startTime
var i = 0
while (i < 5) { // 一个执行计算的循环,只是为了占用 CPU
// 每秒打印消息两次
if (System.currentTimeMillis() >= nextPrintTime) {
println("I'm sleeping ${i++} ...")
nextPrintTime += 500L
}
}
}
delay(1300L) // 等待一段时间
println("main: I'm tired of waiting!")
job.cancelAndJoin() // 取消一个任务并且等待它结束
println("main: Now I can quit.")
给的解释是计算密集型的协程,并且没有检查取消,那么就不会被取消。
但是如果把第一个例子的delay改成sleep,那么那个可以被取消的协程就又可以被取消了。主要不是计算密集型,而是有没有检查取消。
所以在任务里在适当的位置添加检查取消的操作:
if (isActive) {
//do something and return
return
}