CoroutineContext — это неизменяемая коллекция элементов, которые определяют поведение корутины. Ключевые элементы включают:
Job — контролирует жизненный цикл корутиныCoroutineDispatcher — определяет поток(и) для выполненияCoroutineName — присваивает удобное для отладки имяCoroutineExceptionHandler — обрабатывает необработанные исключенияCoroutineScope — это обёртка вокруг CoroutineContext, которая служит обязательным ресивером для билдеров корутин, таких как launch и async:
interface CoroutineScope {
val coroutineContext: CoroutineContext
}
Его основная цель — группировать и управлять связанными корутинами, обеспечивая их отмену вместе как единого целого.
Когда ты запускаешь дочернюю корутину, она наследует элементы контекста родителя автоматически. Job дочерней корутины становится дочерним по отношению к Job родителя, устанавливая иерархию структурированной конкурентности:
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
scope.launch {
// Наследует Dispatchers.IO; новый Job является дочерним для SupervisorJob
}
Ты можешь переопределить конкретные элементы для одной корутины без влияния на скоуп:
scope.launch(Dispatchers.Main) {
// Использует Dispatchers.Main, но всё ещё связан с родительским Job
}
CoroutineContext | CoroutineScope | |
|---|---|---|
| Роль | Определяет поведение | Управляет жизненным циклом |
| Использование | Конфигурация | Запуск корутин |
Практический вывод: используй CoroutineScope, чтобы контролировать когда корутины отменяются, и CoroutineContext, чтобы контролировать как они выполняются.
CoroutineScope сам по себе является CoroutineContext, что позволяет использовать его напрямую в качестве параметра для построителей корутин без доступа к его свойству coroutineContext.
Новый — ещё не проверен сообществом
Вы