Выбор ответа Middle ViewModel и сохранение состояния обновлено

ViewModel через конструктор

Вопрос

Что не так с этим кодом в Activity?

class ProfileActivity : ComponentActivity() {
    private lateinit var vm: ProfileViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        vm = ProfileViewModel(ProfileRepository())
    }
}

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

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

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

Коротко

Правильный ответ: ViewModel создаётся мимо ViewModelStore: при повороте новый объект и старый не очищен. Прямой вызов конструктора даёт обычный объект, о котором не знает ViewModelStore.

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

  1. Ничего: это обычный способ создать ViewModel, если у неё нет параметров
  2. ViewModel создаётся мимо ViewModelStore: при повороте новый объект и старый не очищенправильный ответ
  3. Код не скомпилируется: конструктор ViewModel закрыт и доступен только провайдеру
  4. ViewModel создастся в фоновом потоке, и обращение к UI из неё приведёт к падению

Разбор

Прямой вызов конструктора даёт обычный объект, о котором не знает ViewModelStore. После поворота onCreate создаст новый экземпляр, загрузка начнётся заново, а старый объект никто не очистит: onCleared не вызовется, и его viewModelScope продолжит работу. Нужно by viewModels() или ViewModelProvider(this)[ProfileViewModel::class.java]. Конструктор публичный, поток главный.

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

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

Термины по теме