Работал ли с SupervisorJob

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

Ответ

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)