ViewModel очищается, когда включена опция «не держать активность» - PullRequest
0 голосов
/ 23 апреля 2020

Вот мои настройки 1. Основное действие - Содержит MainFragment Mainfragment - Имеет MainFragViewModel

Repro - 1. Включение не сохраняет действия в настройках разработчика. 2. Запустите приложение. 3. Нажмите домой.

Теперь из-за наших настроек следующие действия произошли, когда приложение перешло в фоновый режим. 1. Модель представления фрагмента - onCleared () [НЕОБХОДИМО, потому что система убивает фрагмент, а процесс приложения не уничтожен.] 2. Фрагмент уничтожен [Ожидается] 3. Основная активность уничтожена - isFinishing = false (это означает, что фреймворк знает, кто убивает) [Ожидается] 4. Приложение не было уничтожено [Ожидается]

Теперь снова запустите приложение с карточек фоновых приложений. и следующее случилось. 1. Основная активность - onCreate (bundle! = Null) [Ожидается. Также доставлен комплект! все хорошо] 2. Фрагмент создан [Ожидается - пакет доставлен. т.е. не нуль] 3. Создан экземпляр FragmentViewModel [Неожиданно !! как модель представления должна была выжить. Потому что мы не поп фрагмент. Он был убит системой из-за настройки dev]

Это поведение нарушает мой дизайн, и для того, чтобы мои приложения работали нормально на телефоне разработчиков, которые могут включиться, не сохраняют активность. Я должен сохранить информацию в Bundle !!

Чего мне не хватает? Каковы ваши возможные решения?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Это сделано преднамеренно - ViewModels сохраняются только после изменений конфигурации. «Не сохранять действия» означает, что действия не проходят изменение конфигурации - они полностью уничтожены и только их сохраненное состояние экземпляра сохраняется. Вы заметите, что isFinishing() - это , а не - правильная проверка - правильная проверка - isChangingConfigurations(), которая действительно ложна, когда действие прекращается из-за действия «Не выполнять действия».

Это тот же тип поведения, с которым вы столкнулись бы, если бы ваш процесс был остановлен из-за нехватки памяти, поэтому вы должны убедиться, что ваш фрагмент работает при восстановлении только из сохраненного состояния экземпляра.

0 голосов
/ 23 апреля 2020

Мое первое предложение - улучшить ваш вопрос. Цель вашего вопроса довольно расплывчата, и то, что я собираюсь предложить, также делает его расплывчатым.

У меня сложилось впечатление, что вы хотите, чтобы ваши viewModel пережили Activity's destruction/construction process. Для этого у вас есть два варианта:

Использовать ViewModelProviders

Использовать ViewModelFactory

Я бы посоветовал протестировать ваше устройство, а также убедиться, что нет никаких ограничений памяти, которые заставляя режим отладки очистить viewModel. ViewModel не должен очищаться до тех пор, пока приложение выживает или указано, что оно очищено явно.

...