Выбор ответа Senior Многопоточность и WorkManager обновлено
Отправка сообщения в viewModelScope
Вопрос
Пользователь нажимает «Отправить» и сразу закрывает экран. Отправка запущена в viewModelScope.launch { api.send(msg) }. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Запрос, скорее всего, отменится вместе с viewModelScope, сообщение может не уйти. При закрытии экрана вызывается onCleared, и viewModelScope отменяет свои корутины, в том числе недоделанный запрос.
Варианты ответа
- Сообщение отправится:
viewModelScopeдожидается всех активных корутин перед своей очисткой - Приложение упадёт с
CancellationException, так как запрос уже в полёте - Запрос выполнится после повторного открытия экрана, корутина возобновится
- Запрос, скорее всего, отменится вместе с
viewModelScope, сообщение может не уйтиправильный ответ
Разбор
При закрытии экрана вызывается onCleared, и viewModelScope отменяет свои корутины, в том числе недоделанный запрос. Работа, которая должна завершиться независимо от экрана, переносится: в application-scope (если процесс жив) или, для гарантии, в WorkManager с сохранением сообщения в базу. Падения нет, автоматического повтора тоже.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.