kotlin: 用withContext(NonCancellable)使代码不响应cancel()
一,例子:用cancel()取消job
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
val job = launch {
try {
println("try start")
delay(1000)
println("try end")
} finally {
println("finally start")
delay(1000)
println("finally end")
}
}
yield()
job.cancelAndJoin()
}
}
运行结果:
cancel()后代码未能执行完
二,改进:用withContext(NonCancellable)使代码不响应cancel()
代码:
//处理按钮点击事件
binding.button3.setOnClickListener {
runBlocking {
val job = launch {
try {
println("try start")
delay(1000)
println("try end")
} finally {
println("finally start")
withContext(NonCancellable) {
println("delay start")
delay(1000)
println("delay end")
}
println("finally end")
}
}
yield()
job.cancelAndJoin()
}
}
运行结果:
可见,加了withContext(NonCancellable)之后,finally中的代码得到了完整执行,未被cancel,
而try中的代码则被cancel,未能执行完