Где сохранить состояние ViewModel в MVVM Android?

#java #android #kotlin #mvvm #viewmodel

#java #Android #kotlin #mvvm #viewmodel

Вопрос:

Как новичок в разработке Android, я пытаюсь очистить свою кодовую базу из моего первого приложения, преобразовав ее в рекомендуемую структуру MVVM. В настоящее время я застрял, пытаясь найти наилучший способ сохранения состояния моей модели представления.

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

В настоящее время я использую базу данных Firebase в реальном времени для хранения моих данных, которые мне нужны, сохраненные, доступ к которым осуществляется через репозиторий, как рекомендует архитектура Android. Однако состояние моей ViewModel не нужно сохранять после закрытия приложения, поэтому определенно не имеет смысла выполнять сетевые вызовы для моей базы данных Firebase.

Мой вопрос: где было бы наиболее целесообразно сохранить состояние моей ViewModel?Полуразумные варианты, которые я вижу перед собой, — это сохранение его как полей в моем классе ViewModel (мой текущий подход), сохранение его в базе данных Room (и сброс базы данных каждый раз, когда приложение отключается) или сохранение его как полей в моем классе репозитория (кажется неправильным). Я открыт для предложений!

Ответ №1:

Это зависит от ваших потребностей:

  • Если вы хотите сохранить состояние только для изменений конфигурации, вам больше ничего не нужно делать. ViewModel обработает это за вас.
  • Если вы хотите увидеть то же состояние, когда вернетесь к этому экрану после его закрытия, я бы рекомендовал использовать локальное решение для кэширования, такое как Room. Вы можете создать репозиторий поверх room и внедрить его в свою Viewmodel.
  • Если вы хотите сохранить состояние до закрытия приложения, вы также можете создать репозиторий в памяти (одноэлементный репозиторий с состоянием). Когда приложение будет уничтожено, эта память будет восстановлена ОС, чтобы они были очищены.

В любом случае удаленное хранение данных, похоже, не является решением, которое вы ищете.

Я бы также не стал полагаться на решение для кэширования памяти из-за ситуаций восстановления системной памяти Android.

Вы можете использовать решение для кэширования и очистить кеш при повторном открытии приложения.

Комментарии:

1. Хакен, спасибо за ответ. Когда вы говорите сохранить состояние в хранилище в памяти, вы имеете в виду просто сохранить состояние в виде полей в классе репозитория?

2. ДА. Однако вы также должны знать, что если ваше приложение будет остановлено при переключении на другое приложение, система Android может отключить ваше приложение из-за нехватки памяти, чтобы освободить часть памяти. В этом случае, поскольку ваше приложение уничтожено, ваш синглтон в состоянии памяти также будет очищен. Как я добавил к ответу, в зависимости от ваших потребностей, решение для кэширования может быть лучшим выбором. Вы можете очищать свое локальное состояние каждый раз, когда открываете приложение.

3. Хакан, это помогает, спасибо. Я понимаю, что сохранение состояния в виде полей в репозитории или модели представления не сохраняется, когда система Android завершает работу приложения. Это приемлемо, и в настоящее время я сохраняю состояние своего представления, я просто не был уверен, как это сделали другие разработчики.