Экран закрыт, а корутина продолжает работать: чем плох 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 вне главного потока запрещена
