kotlin协程的取消

对于可被取消的协程和不可被取消的协程。

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
}

你可能感兴趣的:(kotlin协程的取消)