我在玩android的supervisorScope。该文档说以下内容。
子项的失败不会导致此范围失败,也不会影响其他子项,因此可以实施用于处理其子项失败的自定义策略。有关详细信息,请参见SupervisorJob。范围本身的故障(在块中引发异常或取消)会使范围及其所有子级失效,但不会取消父级作业。
但是请考虑以下代码
viewModelScope.launch {
launch { someLongJob() }
supervisorScope {
launch { jobTwo() }
launch { jobThree() }
delay(500)
throw ArithmeticException()
}
}
private suspend fun someLongJob() {
try {
delay(Long.MAX_VALUE)
} catch (e: Exception) {
Log.d(TAG, "Long job cancelled")
}
}
private suspend fun jobOne() {
delay(1000)
throw ArithmeticException()
}
private suspend fun jobTwo() {
try {
delay(2000)
} catch (e: Exception) {
Log.d(TAG, "Job 2 cancelled")
throw e
}
Log.d(TAG, "Job 2 completed successfully")
}
private suspend fun jobThree() {
try {
delay(3000)
} catch (e: Exception) {
Log.d(TAG, "Job 3 cancelled")
throw e
}
Log.d(TAG, "Job 3 completed successfully")
}
它产生以下输出
D / TEST:作业2已取消
D / TEST:作业3已取消
D / TEST:取消长期工作
---崩溃开始
我的疑问是,按照粗体显示的文档,supervisorScope不应取消其父项,即使该作用域本身失败意味着不应取消(在父项作业中运行的)长作业。但是输出清楚地表明,在父级中运行的Long作业也被取消。为什么?
supervisorScope
与其他函数一样,是一个函数调用。就您而言,它突然完成,但有例外。既然你没抓住,同样的异常事件引起了launch
块突然完成的,这导致它被取消。然后,遵循结构化并发的基本原则,取消向内传播并取消了所有子作业。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句