Компоненты архитектуры Android: ViewModel продолжает переинициализироваться - PullRequest
0 голосов
/ 05 июня 2018

У меня есть действие, в котором используется компонент архитектуры ViewModel :

class RandomIdViewModel : ViewModel() {
    var currentId : MutableLiveData<String?> = MutableLiveData()

    init {
        currentId.value = UUID.randomUUID().toString()
    }
}

А затем в моей деятельности у меня есть это в методе onCreate () :

viewModel = ViewModelProviders.of(this).get(RandomIdViewModel::class.java)
viewModel.currentId.observe(this, idObserver)

Каждый раз, когда я поворачиваю свой телефон, Id меняется.Так что я совершенно не понимаю, почему вызывается init при установке объекта viewModel.

EDIT

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

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

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

1 Ответ

0 голосов
/ 05 июня 2018

Похоже, что проблема связана с наличием в действии глобальной переменной, которая хранит ссылку на ViewModel в качестве однократного отключения.Кажется, что во всех примерах виртуальная машина используется в локальной переменной, которая не работает для меня (я не хочу, чтобы мои наблюдатели объявлялись как встроенные, так как это делает код довольно грязным 1 ).Кажется, что локальная переменная получает новый экземпляр каждый раз, когда происходит изменение конфигурации.Однако, если я создаю метод:

private fun viewModel() = ViewModelProviders.of(this).get(RandomIdViewModel::class.java)

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

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

override fun onResume() {
    super.onResume()
    viewModel().currentId.observe(this, idObserver)
}

override fun onPause() {
    viewModel().currentId.removeObserver(idObserver)
    super.onPause()
}
...