Ответ
SupervisorJob — это особый тип Job в Kotlin Coroutines, который позволяет дочерним корутинам завершаться с ошибкой, не отменяя родительскую и другие дочерние корутины. Полезен, например, при параллельных независимых задачах.
Пример:
val supervisorJob = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + supervisorJob)
scope.launch {
// Эта корутина может упасть, не влияя на другие
throw Exception("Oops!")
}
scope.launch {
// Эта корутина продолжит работать
delay(1000)
println("Still alive")
}
Ключевые моменты:
- Ошибки в дочерних корутинах не распространяются на родителя
- Все равно нужно обрабатывать исключения через try/catch или CoroutineExceptionHandler
- Часто используется в ViewModel с viewModelScope (там по умолчанию SupervisorJob)
Ответ 18+ 🔞
А, ну это же классика, ёпта! Смотри, есть такая штука — SupervisorJob. Представь себе бригадира на стройке, который не начинает орать и всех гнать домой, если один работяга молотком по пальцу съебался. Вот этот дядя — он и есть.
По-простому: это такая работа для корутин, где если одна дочерняя загнётся с ошибкой, остальные не побегут следом в пизду. Родительская корутина тоже не накроется медным тазом. Полезно, когда у тебя куча независимых задач — одна упала, а остальные должны дальше пахать.
Вот, смотри на код, тут всё понятно:
val supervisorJob = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + supervisorJob)
scope.launch {
// Эта корутина может упасть, не влияя на другие
throw Exception("Oops!")
}
scope.launch {
// Эта корутина продолжит работать
delay(1000)
println("Still alive")
}
Видишь? Первая крикнула "ой, всё!" и вылетела с ошибкой. А вторая спокойно себе поспала секунду и напечатала "Still alive". Никакой паники, все довольны. Без SupervisorJob'а весь scope мог бы накрыться, и вторая задача даже не стартанула бы — вот в чём, сука, разница.
Теперь главное, что надо помнить, а то подозрение ебать чувствую, что народ это проёбывает:
- Ошибки в детях не лезут к родителю. Это основная фишка. Родительский Job остаётся жив-здоров, другие дети тоже. Но! Это не значит, что ошибки сами собой испаряются.
- Исключения всё равно ловить надо. А то будешь сидеть и думать: "Почему у меня тут всё тихо, а в логах овердохуища крешей?" Лови их через
try/catchили вешайCoroutineExceptionHandler. Иначе они просто тихо сдохнут, а ты и не узнаешь. - Во ViewModel'ях он уже под капотом. Это, кстати, гениально. Когда ты используешь
viewModelScope, там по умолчанию стоитSupervisorJob. Потому что логично: один экран упал (например, не загрузились данные), а остальные-то живут! Не отменять же всю хуйню из-за одной ошибки.
Короче, суть в том, чтобы изолировать пиздец. Один ебанько накосячил — ну и хуй с ним, пусть остальные работают. Главное — не забывай про ошибки, а то будет тебе хиросима в логах, а ты и не в курсе.