Компоненты архитектуры Android: ViewModel продолжает повторно инициализироваться

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

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

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

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

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

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

ИЗМЕНИТЬ

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

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

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


person Quintin Balsdon    schedule 05.06.2018    source источник


Ответы (1)


Похоже, что наличие глобальной переменной в действии, которая хранит ссылку на 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()
}
person Quintin Balsdon    schedule 05.06.2018