gpt4 book ai didi

android - Kotlin Coroutine SupervisorJob 取消行为

转载 作者:行者123 更新时间:2023-12-02 12:52:38 25 4
gpt4 key购买 nike

代码:

viewModelScope.launch(CoroutineExceptionHandler { _, _ ->
Log.e("TAG", "task 1")
}) {
try {
Log.e("TAG", "task 1 start")
delay(3000)
Log.e("TAG", "task 1 finished")
} catch (ex: Exception) {
Log.e("TAG", "task 1 cancelled " + ex)
}
}

launch = viewModelScope.launch(CoroutineExceptionHandler { _, _ ->
Log.e("TAG", "handler 1" + myJob?.isCancelled)
}) {

myJob = SupervisorJob()
launch(myJob!! + CoroutineExceptionHandler { _, _ ->
Log.e("TAG", "handler 2 " + myJob?.isCancelled)
}) {

delay(300)
launch {
try {
Log.e("TAG", "task 2 start")
delay(5000)
Log.e("TAG", "task 2 finished")
} catch (ex: Exception) {
Log.e("TAG", "task 2 ex " + ex)
}
}

launch {
delay(2000)
throw Exception()
}

}

launch {
try {
Log.e("TAG", "task 3 start")
delay(3000)
Log.e("TAG", "task 3 finished")
} catch (ex: Exception) {
Log.e("TAG", "task 3 ex " + ex)
}
}
}

输出:

2020-01-06 09:47:56.462 7159-7159/? E/TAG: task 1 start
2020-01-06 09:47:56.496 7159-7159/? E/TAG: task 3 start
2020-01-06 09:47:56.798 7159-7159/com.mvvm.template.debug E/TAG: task 2 start
2020-01-06 09:47:58.822 7159-7159/com.mvvm.template.debug E/TAG: task 2 ex kotlinx.coroutines.JobCancellationException: Parent job is Cancelling; job=StandaloneCoroutine{Cancelling}@81a8e39
2020-01-06 09:47:58.827 7159-7159/com.mvvm.template.debug E/TAG: handler 2 false
2020-01-06 09:47:59.464 7159-7159/com.mvvm.template.debug E/TAG: task 1 finished
2020-01-06 09:47:59.499 7159-7159/com.mvvm.template.debug E/TAG: task 3 finished

我的问题:

我无法理解为什么任务 2 在它是 SupervisorJob 的子项时被取消,而异常发生在另一个子项上。

文档状态:

子项的失败或取消不会导致主管工作失败,也不会影响其其他子项,因此主管可以实现自定义策略来处理其子项的失败。我错过了什么吗?任何帮助将不胜感激。

最佳答案

您的答案就在日志中:

task 2 ex kotlinx.coroutines.JobCancellationException: Parent job is Cancelling;
job=StandaloneCoroutine{Cancelling}@81a8e39

查看父作业:它是一个 StandaloneCoroutine 而不是您的 SupervisorJob

当你写作时

launch(myJob!!, handler) { ... }

myJob 成为已启动协程的 parent 并且协程本身始终与 launch 函数为其创建的作业关联, StandaloneCoroutine 类型。在这个协程中,您可以在不明确指定父级的情况下启动更多协程,这意味着它们的父级是协程的工作。这不是主管工作,会被取消。

关于android - Kotlin Coroutine SupervisorJob 取消行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59610852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com