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