В чем разница между SupervisorJob и Job

«В чем разница между SupervisorJob и Job» — вопрос из категории Coroutines и Flow, который задают на 31% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SupervisorJob — это особый вид Job, который отличается обработкой исключений в дочерних корутинах.

  • Обычный Job: если дочерняя корутина падает с исключением, оно распространяется вверх по иерархии, отменяя родителя и все другие дочерние корутины.
  • SupervisorJob: исключение в одной дочерней корутине не влияет на другие дочерние корутины и родителя.

Пример:

val supervisorJob = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + supervisorJob)

scope.launch {
    // Если упадет — не затронет другие корутины
    throw RuntimeException("Ошибка!")
}

scope.launch {
    // Продолжит работу, даже если первая корутина упала
    delay(1000)
    println("Выполнено!")
}

Используется в viewModelScope и других сценариях, где нужно изолировать ошибки.