Ответ
Дочерняя корутина наследует тип Job родителя. Если родитель использует SupervisorJob, дочерняя корутина также получит SupervisorJob. Это означает, что ошибка в одной дочерней корутине не отменит другие дочерние корутины.
val parentJob = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + parentJob)
scope.launch {
// Эта корутина тоже будет иметь SupervisorJob
launch {
// Дочерняя корутина с SupervisorJob
}
}
Важно: если явно передать другой тип Job в контексте дочерней корутины, это переопределит наследование.
Ответ 18+ 🔞
А, слушай, вот тут прикол интересный, про корутины. Представь, что у тебя есть папаша-джоб, который типа надзиратель, SupervisorJob, ну чтоб детишки-корутины друг другу не мешали. Так вот, если папаша такой, то все его детишки по умолчанию рождаются такими же надзирателями, ёпта! То есть если один сопляк-корутин накосячит и накроется медным тазом с ошибкой, то остальные братцы будут жить дальше, как ни в чём не бывало. Не будет этой цепной реакции отмены, овердохуища удобно.
Вот смотри на этот код, тут всё понятно:
val parentJob = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + parentJob)
scope.launch {
// Эта корутина тоже будет иметь SupervisorJob
launch {
// Дочерняя корутина с SupervisorJob
}
}
Видишь? Внутри scope.launch запускается ещё один launch. Так вот этот внутренний пацан автоматом унаследует от родителя этот самый SupervisorJob. Всё, бля, по-семейному.
Но! Тут есть одна хитрая жопа, которую нужно помнить. Наследование — это не железное правило, его можно сломать. Если ты явно, с прибабахом, передашь в контекст дочерней корутины другой тип Job, например, обычный, то наследование нахуй слетает. Ты как бы говоришь системе: «Знаешь что? Не слушай ты моего папашу, вот тебе новый начальник». И всё, приехали. Дочерняя корутина будет жить по новым правилам. Так что, чувак, будь осторожен, не переопредели случайно там, где не надо, а то потом волнение ебать — почему всё поломалось.