oil-painting-2244504_1280

ViewModel — это класс, который отвечает за подготовку и управление данными для Activity или Fragment. Он также обрабатывает связь Activity / Fragment с остальной частью приложения (например, вызывая классы бизнес-логики).

Класс ViewModel предназначен для хранения и управления данными, связанными с пользовательским интерфейсом, с учетом жизненного цикла. Класс ViewModel позволяет данным пережить изменения конфигурации, такие как вращение экрана.

ViewModel — обеспечивает способ создания и извлечения объектов, привязанных к определенному жизненному циклу. ViewModel обычно сохраняет состояние данных view и связывается с другими компонентами, такими как репозитории данных или уровень домена, который обрабатывает бизнес-логику.

Внедрение ViewModel

Architecture Components предоставляют вспомогательный (helper) класс ViewModel для контроллера пользовательского интерфейса, который отвечает за подготовку данных для пользовательского интерфейса.

Объекты ViewModel автоматически сохраняются во время изменений конфигурации, поэтому данные, которые они хранят, немедленно доступны для следующего экземпляра действия или фрагмента.

Например, если вам нужно отобразить список пользователей в вашем приложении, не забудьте возложиьт ответственность за получение и хранение списка пользователей в ViewModel (а не на активность или фрагмент) как показано в следующем примере кода:

Затем вы можете получить доступ к списку из активности следующим образом:

Если активность воссоздана, она получает тот же экземпляр MyViewModel, который был создан первым действием. Когда владелец активности финиширует, фреймворк вызывает метод onCleared() объектов ViewModel, чтобы он мог очищать ресурсы.

Внимание: ViewModel никогда не должен ссылаться на view,  Lifecycle или любой класс, который может содержать ссылку на контекст активности.

ВажноСохранение ссылки на Context или View в ViewModel может привести к утечке памяти. Избегайте полей, которые ссылаются на экземпляры классов Context или View.  Метод onCleared() полезен для отмены или очистки ссылок на другие объекты с более длительным жизненным циклом, но НЕ для очистки ссылок на объекты Context или View.

Читать ещё :   LiveData. Часть 3

Объекты ViewModel предназначены для того, чтобы пережить конкретные экземпляры представлений или LifecycleOwners. Этот дизайн также означает, что вы можете легче писать тесты, чтобы охватить ViewModel, поскольку он не знает объекты view и Lifecycle.

Объекты ViewModel могут содержать LifecycleObservers, такие как объекты LiveData.

Однако объекты ViewModel никогда не должны отслеживать изменения в наблюдаемых для жизненного цикла наблюдаемых данных, таких как объекты LiveData.

Если ViewModel нуждается в контексте приложения, например, чтобы найти системный сервис, он может расширить класс AndroidViewModel и получить конструктор, который получает Application в конструкторе, поскольку класс Application расширяет Context.

Жизненный цикл ViewModel

Объекты ViewModel существуют в scope Lifecycle, переданному ViewModelProvider при получении ViewModel. ViewModel остается в памяти до тех пор, пока Lifecycle область видимости (scope) не исчезнет навсегда: в случае действия, когда он finishes, а в случае фрагмента, когда он detached.

На рисунке 1 показаны различные состояния жизненного цикла активности, когда он подвергается вращению, а затем завершается. На иллюстрации также показано время жизни ViewModel рядом со связанным с ним жизненным циклом деятельности. Эта конкретная диаграмма иллюстрирует состояния активности. Те же основные состояния относятся к жизненному циклу фрагмента.

viewmodel-lifecycle

Обычно вы запрашиваете ViewModel при первом вызове метода onCreate() объекта объекта активности. Система может вызывать onCreate() несколько раз в течение всего срока действия, например, когда экран устройства вращается. ViewModel существует, когда вы впервые запрашиваете ViewModel, пока activity не будет finished and destroyed.

Продолжение следует…