Недавно я подробно изучал сопрограммы, насколько я понимаю, SupervisorJob() дает нам возможность не отменять все дочерние программы, если один из дочерних элементов сопрограммы отменен по какой-либо причине.Говорят, что сопрограммы, запущенные с помощью coroutineScope, отменяют всех дочерних программ в случае сбоя одного из них, но те, которые запущены с SupervisorScope, отменяют только дочерний элемент, в котором произошел сбой
Интересно, могу ли я изменить поведение CoroutineScope, добавив к нему SupervisorJob в качестве CoroutineContext, но я не смог получить ожидаемое поведение, чего я не получаю
Ожидаемое поведение — результаты getData1() и getData3() печатаются*
Фактическое: — getData2 () отменяет все сопрограммы
fun main() = runBlocking {
val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
println(throwable)
}
val customScope = CoroutineScope(SupervisorJob() + exceptionHandler)
customScope.launch {
launch {
getData1().also { println(it) }
}
launch {
getData2().also { println(it) }
}
launch {
getData3().also { println(it) }
}
}.join()
}
private suspend fun getData1(): String? {
delay(1000)
return "data 1"
}
private suspend fun getData2(): String? {
delay(300)
throw RuntimeException("While getting Data 2 exception happened")
}
private suspend fun getData3(): String? {
delay(800)
return "data 3"
}
Подробнее здесь: https://stackoverflow.com/questions/749 ... visorscope
CoroutineScope с SupervisorJob против SupervisorScope ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Разница CoroutineScope(Dispatchers.IO + Job()) и CoroutineScope(Dispatcher.IO) + Job()
Anonymous » » в форуме Android - 0 Ответы
- 43 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Разница CoroutineScope(Dispatchers.IO + Job()) и CoroutineScope(Dispatcher.IO) + Job()
Anonymous » » в форуме Android - 0 Ответы
- 28 Просмотры
-
Последнее сообщение Anonymous
-