Выбор ответа Senior Многопоточность и WorkManager обновлено

Отправка сообщения в viewModelScope

Вопрос

Пользователь нажимает «Отправить» и сразу закрывает экран. Отправка запущена в viewModelScope.launch { api.send(msg) }. Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Запрос, скорее всего, отменится вместе с viewModelScope, сообщение может не уйти. При закрытии экрана вызывается onCleared, и viewModelScope отменяет свои корутины, в том числе недоделанный запрос.

Варианты ответа

  1. Сообщение отправится: viewModelScope дожидается всех активных корутин перед своей очисткой
  2. Приложение упадёт с CancellationException, так как запрос уже в полёте
  3. Запрос выполнится после повторного открытия экрана, корутина возобновится
  4. Запрос, скорее всего, отменится вместе с viewModelScope, сообщение может не уйтиправильный ответ

Разбор

При закрытии экрана вызывается onCleared, и viewModelScope отменяет свои корутины, в том числе недоделанный запрос. Работа, которая должна завершиться независимо от экрана, переносится: в application-scope (если процесс жив) или, для гарантии, в WorkManager с сохранением сообщения в базу. Падения нет, автоматического повтора тоже.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.