Сохранение состояния активности с помощью onSaveInstanceState () и ViewModel - PullRequest
0 голосов
/ 23 февраля 2019

У меня остались некоторые вопросы, касающиеся ViewModels после прочтения этого:

https://developer.android.com/topic/libraries/architecture/saving-states

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

Мой вопрос: как мы узнаем способ восстановления состояния, когда onCreate(Bundle) называется - я должен использовать ViewModel или я должен использовать пакет, полученный в качестве параметра?Когда конфигурация изменяется, также вызывается onSaveInstanceState() и, очевидно, всегда вызывается onCreate().

Если я восстановлю только состояние из ViewModel, оно не всегда останется с правильными данными (поскольку действие могло быть уничтожено по другим причинам, кроме изменений конфигурации).Если я использую только пакет, который я сохраняю в onSaveInstanceState(), тогда зачем мне использовать ViewModel для начала?

1 Ответ

0 голосов
/ 27 февраля 2019

Я думаю, что хорошо думать об этих источниках как о цепочке.У вас есть 2 источника данных - ViewModel, который работает быстрее, но живет меньше, и сохраняет состояние экземпляра, которое работает медленнее, но дольше.

Правило простое - попробуйте использовать ViewModel, и если он не заполнен, используйте комплектfrom onSaveInstanceState ().

Когда вы делаете val model = ViewModelProviders.of(this).get(MyViewModel::class.java) в onCreate (), вы можете проверить, получаете ли вы новый экземпляр viewModel.Затем, если это новый экземпляр (т. Е. Его поля данных пусты), вы можете получить некоторые базовые данные из вашего пакета, такие как идентификатор контента, и извлечь данные из серверной части или базы данных на основе этого идентификатора, заполнить им новый ViewModel изатем заполните свою активность из ViewModel (если вы используете LiveData, это будет очень естественно).

В следующий раз при вызове onCreate вы повторите процесс, либо заполнив свою деятельность из ViewModel, либо заполнив свою ViewModel, используя данные вСвязывайте и затем заполняйте вашу деятельность из вашей ViewModel.

Обновление: На самом деле, есть очень похожий подход, описанный в официальных документах .Единственное отличие состоит в том, что вы передаете пакет в ViewModel, и он решает, нужно ли ему извлекать данные, я не уточнил этот механизм.

...