Найти тему

Немного про ViewModel. Часть 1.

Оглавление

При разработке мы часто сталкиваемся с проблемой смены конфигурации (например, когда поворачивается экран и данные теряются). Это может расстроить пользователя, и он поставит приложению плохой отзыв. Разработчик разочаруется в себе, что приведёт к выгоранию, депрессии и в итоге он уезжает жить в деревню, бросая всё. Поговорим о том, как можно избежать всего этого.

Небольшое введение в ViewModel

ViewModel является частью библиотеки Android Jetpack. Она предназначена для хранения и управления данными, связанными с UI, в соответствии с жизненным циклом активити или фрагмента. По сути, она работает как мост между репозиторием данных и пользовательским интерфейсом.

ViewModel сохраняет своё состояние и не уничтожается при смене конфигурации. Это происходит благодаря тому, что объекты ViewModel живут в специальном хранилище (ViewModelStore), которое не уничтожается при смене конфигурации. Вместо этого, при пересоздании активити, новый экземпляр активити может получить доступ к уже существующему ViewModel и продолжить работу с текущим состоянием данных.

Вот так выглядит простая ViewModel: https://github.com/Ladgertha/Asteroid-Radar/blob/master/app/src/main/java/ru/ladgertha/asteroidradar/main/MainViewModel.kt

Основные компоненты

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

Когда мы запрашиваем ViewModel через ViewModelProvider, происходит следующее:

  1. ViewModelProvider проверяет, существует ли уже созданная ViewModel в ViewModelStore для текущей активити или фрагмента.
  2. Если ViewModel найдена, она возвращается для использования. Если не найдена, то ViewModelProvider.Factory используется для создания новой ViewModel и она потом сохраняется в ViewModelStore.
  3. С созданной ViewModel мы можем взаимодействовать, и она будет жить до тех пор, пока живёт активити или фрагмент.
  4. Если активити/фрагмент уничтожается навсегда (то есть пользователь закрыл её, либо был вызван метод finish(), либо фрагмент удалён), то ViewModelStore очищается, и все хранящиеся в нем ViewModel объекты удаляются. Также вызывается onCleared() для каждой ViewModel, позволяя очистить ресурсы, которые могут в противном случае привести к утечке памяти.

Самое интересное: по умолчанию, если активити пересоздается, все ViewModel, связанные с этой активити, сохраняются, чтобы они могли быть переданы новому экземпляру активити. Только при окончательном завершении активити ViewModel удаляется и вызывается метод onCleared().

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

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes

P.S. сделано с помощью ChatGPT и Midjourney. :)