Я играл с supervisorScope в android. В документации сказано следующее:
Сбой дочернего элемента не приводит к сбою этой области и не влияет на другие дочерние элементы, поэтому можно реализовать настраиваемую политику для обработки сбоев своих дочерних элементов. Смотрите 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: долгое задание отменено
--- начало cra sh
Я сомневаюсь, что в соответствии с документацией, выделенной жирным шрифтом, supervisorScope не должен отменять своего родителя, даже когда сама область действия не выполняется, а это означает, что долгое задание (выполняемое в родительском задании) не следует отменять. Но выходные данные ясно показывают, что длинное задание, которое выполняется в родительском объекте, также отменяется. Почему?