kotlin: 用SupervisorJob控制异常传播的范围。
一,例一:用 SupervisorJob避免因异常崩溃
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
val scope = CoroutineScope(SupervisorJob())
scope.async {
println("scope.async开始");
delay(100L)
1 / 0
}
println("delay开始")
delay(500L)
println("End")
}
}
运行结果:
当我们使用 SupervisorJob 创建一个 scope 以后,用 scope.async{}启动协程后,
只要不调用“deferred.await()”,程序就不会因为异常而崩溃
二,例二,用 SupervisorJob+try-catch捕捉异常
代码:
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
val scope = CoroutineScope(SupervisorJob())
// 变化在这里
val deferred = scope.async {
println("scope.async开始");
delay(100L)
1 / 0
}
println("delay1开始");
delay(500L)
try {
println("try开始");
deferred.await()
} catch (e: ArithmeticException) {
println("e开始");
println("Catch: $e")
}
println("delay2开始");
delay(500L)
println("End")
}
}
运行结果:
说明:
SupervisorJob 与 Job 最大的区别就在于,
当它的子 Job 发生异常的时候,其他的子 Job 不会受到牵连。
普通Job:如果 父Job 是一个普通的 Job 对象,
那么当 子Job job1 发生异常之后,它会导致 父Job 取消,
进而导致 子Job job2、子Job job3 等也受到牵连。