Вступить в клуб →
средняявопросПлатформы и жизненный цикл приложения

Экран закрыт, а корутина продолжает работать: чем плох GlobalScope во ViewModel

Экран профиля загружает данные так:

class ProfileViewModel(private val repo: ProfileRepository) : ViewModel() {
    private val _state = MutableStateFlow<Profile?>(null)
    val state: StateFlow<Profile?> = _state

    fun load(id: String) {
        GlobalScope.launch {
            val profile = repo.fetch(id)   // отвечает примерно 3 секунды
            _state.value = profile
        }
    }
}

Пользователь открывает профиль и сразу нажимает «назад», и так десять раз подряд.

Что произойдёт?

  • Корутины встанут в общую очередь и выполнятся строго по одной, поэтому следующий заход на экран будет ждать завершения предыдущего запроса и экран заметно затормозит
  • GlobalScope сам отменит работу, как только у StateFlow не останется подписчиков
  • Все десять запросов продолжат выполняться после закрытия экранов и будут удерживать ссылки на ViewModel и репозиторий
  • Приложение упадёт, потому что запись в StateFlow вне главного потока запрещена

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела