В чем разница между Dispatchers.Main и Dispatchers.Main.immediate в Coroutines

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

Ответ

Dispatchers.Main и Dispatchers.Main.immediate оба работают с главным потоком, но различаются поведением при вызове из него:

  • Dispatchers.Main всегда планирует выполнение в следующем цикле событий, даже если вызывается из главного потока
  • Dispatchers.Main.immediate выполняет код немедленно, если уже находится в главном потоке, иначе ведет себя как обычный Main

Пример:

// Если вызвано из Main потока:
withContext(Dispatchers.Main) {
    // выполнится в следующем цикле событий
}

withContext(Dispatchers.Main.immediate) {
    // выполнится сразу
}

Main.immediate полезен для оптимизации, когда нужно избежать лишнего переключения контекста, если уже находишься в главном потоке.