Где хранится ViewModel в Android
Что проверяют
Понимаете ли вы механизм, за счёт которого она переживает поворот экрана, и знаете ли, чего она пережить не может.
Как отвечать
ViewModel хранится в объекте ViewModelStore, который принадлежит владельцу: активити, фрагменту или элементу стека навигации. При изменении конфигурации активити пересоздаётся, а хранилище передаётся новому экземпляру, поэтому модель остаётся той же и данные не перезагружаются.
Ключевые следствия:
- область жизни задаётся владельцем: модель, полученная в активити, общая для всех её фрагментов, а модель фрагмента своя. В навигации можно привязать модель к маршруту или к графу, и тогда она живёт ровно столько, сколько этот участок стека;
onCleared()вызывается при окончательном уничтожении владельца, а не при повороте. Там освобождают ресурсы, а корутины вviewModelScopeотменяются сами;- смерть процесса модель не переживает: система может убить приложение в фоне, и хранилище исчезнет вместе с ним. Для этого случая есть
SavedStateHandle, который сохраняет ключевые параметры и восстанавливает их при возврате; - ссылок на интерфейс внутри быть не должно: контекст активити, вид или фрагмент в поле модели это утечка, потому что модель живёт дольше. Нужен контекст, берут
AndroidViewModelс контекстом приложения.
Полезно добавить, что модель это не хранилище данных приложения, а держатель состояния экрана: кеш и источник истины живут в слое данных, иначе при смерти процесса всё придётся грузить заново.
Где спотыкаются
Считают, что ViewModel переживает всё, включая перезапуск приложения.
Хранят в ней ссылку на активити или на вид.
Создают модель через конструктор вместо провайдера и теряют весь смысл: такой объект пересоздаётся вместе с экраном.