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

У меня есть действие, в котором используется компонент архитектуры 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)

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

РЕДАКТИРОВАТЬ

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

ViewModel is ideal for storing and managing UI-related data while the user is actively using the application. It allows quick access to UI data and helps you avoid refetching data from network or disk across rotation, window resizing, and other commonly occurring configuration changes. ...

ViewModel is ideal for storing and managing UI-related data while the user is actively using the application. It allows quick access to UI data and helps you avoid refetching data from network or disk across rotation, window resizing, and other commonly occurring configuration changes

1
0
1 023
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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()
}

Другие вопросы по теме