Выбор ответа 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.
Варианты ответа
- Ничего: это обычный способ создать ViewModel, если у неё нет параметров
- ViewModel создаётся мимо
ViewModelStore: при повороте новый объект и старый не очищенправильный ответ - Код не скомпилируется: конструктор ViewModel закрыт и доступен только провайдеру
- ViewModel создастся в фоновом потоке, и обращение к UI из неё приведёт к падению
Разбор
Прямой вызов конструктора даёт обычный объект, о котором не знает ViewModelStore. После поворота onCreate создаст новый экземпляр, загрузка начнётся заново, а старый объект никто не очистит: onCleared не вызовется, и его viewModelScope продолжит работу. Нужно by viewModels() или ViewModelProvider(this)[ProfileViewModel::class.java]. Конструктор публичный, поток главный.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.