Что такое диспетчер в Kotlin корутинах
Что проверяют
Понимаете ли вы, что корутина не привязана к потоку, а диспетчер решает, где она продолжит работу после каждой приостановки. Следом обычно спрашивают, нужно ли оборачивать вызов Retrofit в withContext(Dispatchers.IO) и как подменить диспетчеры в тестах.
Как отвечать
CoroutineDispatcher это элемент CoroutineContext, который решает, на каком потоке или пуле запускается и возобновляется корутина. Задают его при запуске (launch(Dispatchers.Default)), а переключают через withContext.
Dispatchers.Main: главный поток для работы с UI, его даётkotlinx-coroutines-android. На голой JVM без этого модуля обращение кMainбросит исключение;Dispatchers.Main.immediate: если корутина уже на главном потоке, код выполняется сразу, без повторной постановки в очередь. Именно его используютviewModelScopeиlifecycleScope;Dispatchers.Default: пул по числу ядер CPU (минимум два потока) для вычислений: разбор больших JSON, сортировка, обработка изображений;Dispatchers.IO: для блокирующих вызовов, файлов, старых синхронных API. Делит потоки сDefault, но допускает до 64 параллельных задач или больше, если ядер больше.limitedParallelism(n)выделяет из него срез поменьше;Dispatchers.Unconfined: стартует в потоке вызывающего, а после первой приостановки продолжает там, где её возобновили. В прикладном коде почти не нужен.
Стоит проговорить правило main-safe: suspend-функция сама переключает контекст внутри репозитория, а ViewModel спокойно зовёт её с главного потока. Room и Retrofit с suspend-методами уже main-safe. Диспетчеры передают через конструктор, а в тестах подставляют StandardTestDispatcher и вызывают Dispatchers.setMain из kotlinx-coroutines-test.
Где спотыкаются
Отождествляют диспетчер с потоком. Корутина на Dispatchers.IO после delay может продолжиться на другом потоке того же пула, поэтому ThreadLocal без asContextElement() там теряет значение.
Оборачивают suspend-вызовы Retrofit в withContext(Dispatchers.IO). Это не ломает код, но выдаёт незнание библиотеки.
Хардкодят Dispatchers.IO в классах, и тест уже не может управлять виртуальным временем.