kotlin:协程:已结束或已取消的协程作为父协程时不会被执行
一,已结束协程作父协程
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
println("main start") // 1
val job = launch { // 协程1
println("launch 1 start") // 2
delay(1000L) // TODO 延时1
println("launch 1 end") // 3
}
println("main mid") // 4
job.join()
println("job isActive:"+job.isActive)
println("job isCancelled:"+job.isCancelled)
println("job isCompleted:"+job.isCompleted)
val job2 = launch(job) { // 协程2
println("launch 2 start") //5
delay(1000L) // TODO 延时2
println("launch 2 end") //6
}
delay(1500) // TODO 延时3
println("main end") // 7
}
}
运行结果:
二,已取消协程作父协程
代码:
//处理按钮点击事件
binding.button3.setOnClickListener {
runBlocking {
println("main start") // 1
val job = launch { // 协程1
println("launch 1 start") // 2
delay(1000L) // TODO 延时1
println("launch 1 end") // 3
}
val job2 = launch(job) { // 协程2
println("launch 2 start") //5
delay(1000L) // TODO 延时2
println("launch 2 end") //6
}
delay(100) // TODO 延时3
job.cancel()
println("job isActive:"+job.isActive)
println("job isCancelled:"+job.isCancelled)
println("job isCompleted:"+job.isCompleted)
val job3 = launch(job) { // 协程2
println("launch 3 start") //8
delay(1000L) // TODO 延时2
println("launch 3 end") //9
}
println("main end") // 7
}
}
运行结果: