kotlin: 协程的取消需要内部的配合
一,例子一:
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
val job = launch(Dispatchers.Default) {
var i = 0
while (true) {
Thread.sleep(500L)
//delay(500L)
i ++
println("i = $i")
}
}
delay(2000L)
job.cancel()
job.join()
println("End")
}
}
运行结果:

cancel()执行后无效,因为launch的协程中并没有判断当前协程的状态
二,改进,增加协程状态的判断:
代码:
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
val job = launch(Dispatchers.Default) {
var i = 0
while (isActive) { //此处改进,使用isActive判断协程状态是否被取消
Thread.sleep(500L)
//delay(500L)
i ++
println("i = $i")
}
}
delay(2000L)
job.cancel()
job.join()
println("End")
}
}
运行结果:

浙公网安备 33010602011771号