Как перехватывать Exception в Coroutine. Часть 2
Разберемся с тем, как формируется контекст корутины
CoroutineContext — параметры корутины или CoroutineScope:
• Job или SupervisorJob
• Dispatcher (IO, Main, Default...)
• CoroutineExceptionHandler (или его отсутствие)
• CoroutineName (параметр для дебага)
Алгоритм формирования для CoroutineScope:
• стандарные параметры + унаследованные + указанные в билдере
Алгоритм формирования для корутины:
• стандарные параметры + унаследованные + указанные в билдере + Job
при этом слагаемые справа переопредяют предыдущие
Пример:
CoroutineScope() {
launch(Dispatcher.Main + SupervisorJob()) {
launch(Dispatcher.Default) {}
}
}
Контекст для CoroutineScope:
• Dispatcher.Default, CoroutineName("coroutine"), Job1
для внешнего launch:
• Dispatcher.Main, CoroutineName("coroutine"), Job2
для внутреннего launch:
• Dispatcher.Default, CoroutineName("coroutine"), Job3
На что обратить внимание:
• у внешнего launch в контексте исчезает SuperviserJob, потому что при формирование прибавляется Job справа
то есть установит SuperviserJob можно только в CoroutineScope
• между всеми Job установлены parent-child отношения
если вызвать Job1.cancel(), то Job1 и Job2 тоже будут остановлены
а если в launch явно передать Job(), то взаимоотношения разрушаться. родитель не будет ожидать завершения работы такого ребенка, и останавливать его не будет
Post #73
2.03K