Зачем нужен каждый Dispatcher в корутинах

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

Ответ

Dispatchers в корутинах определяют, на каком потоке будет выполняться код:

  1. Dispatchers.Main – UI-поток в Android. Используется для работы с View:
withContext(Dispatchers.Main) {
    textView.text = "Updated"
}
  1. Dispatchers.IO – для блокирующих операций (сеть, БД, файлы). Имеет расширяемый пул потоков:
withContext(Dispatchers.IO) {
    val data = api.fetchData()
}
  1. Dispatchers.Default – для CPU-интенсивных задач (сортировка, сложные вычисления). Использует фиксированное количество потоков (по умолчанию = числу ядер CPU).

  2. Dispatchers.Unconfined – запускает корутину в текущем потоке, но может продолжить в любом после первого suspension. Используется редко.

Нюансы:

  • Не используйте Main для тяжелых операций – приведет к ANR
  • IO и Default имеют разные пулы потоков, но могут использовать одни и те же потоки при простаивании
  • Можно создавать кастомные диспетчеры через newSingleThreadContext() или newFixedThreadPoolContext()