Проверяет знание различных контекстов и скоупов для старта корутин.
Корутины запускаются через launch или async внутри CoroutineScope:
GlobalScope.launch {} — в глобальном скоупе (не рекомендуют).
lifecycleScope.launch {} и viewModelScope.launch {} в Android.
runBlocking {} для блокирующих тестов.
Каждый метод позволяет задать Dispatcher (Main, IO, Default) для выполнения на нужном потоке.
launch vs async:
launch возвращает Job и не возвращает результат.
async возвращает Deferred<T>, результат из await().
Scopes:
GlobalScope — живёт до завершения приложения.
CoroutineScope на уровне классов:
viewModelScope (от AndroidX)
lifecycleScope (Activity/Fragment)
runBlocking — создаёт блокирующую корутину для main/тестов.
Dispatcher:
Dispatchers.Main — UI-поток.
Dispatchers.IO — для I/O.
Dispatchers.Default — для CPU-загрузок.
Пример:
viewModelScope.launch(Dispatchers.IO) {
val data = repository.load()
withContext(Dispatchers.Main) {
updateUi(data)
}
}