Почему Обозреватели, добавленные в качестве наблюдающего для LiveData, должны быть удалены? - PullRequest
2 голосов
/ 29 апреля 2019

Я прочитал документацию Android LiveData , что:

Вы можете зарегистрировать наблюдателя без связанного с ним объекта LifecycleOwner, используя метод наблюдаемый (наблюдатель). В этом случае наблюдатель считается всегда активным и поэтому всегда уведомляется об изменениях. Вы можете удалить этих наблюдателей, вызвав метод removeObserver (Observer).

Я создаю приложение, используя шаблон архитектуры MVVM, используя ViewModel и объявляю LiveDatas внутри моего класса ViewModel. В моей viewModel я установил observeForever для LiveData:

val password by lazy {
    MutableLiveData<String>()
}

init {
    initObservable()
}

private fun initObservable() {
    password.observeForever {
        ...
    }
}

Из того, что я понял из документации, я должен удалять наблюдателя каждый раз, когда представление, которое создает экземпляр ViewModel (с предыдущим кодом), было уничтожено, верно? Но не должны ли наблюдатели быть уничтожены после уничтожения представления (поскольку экземпляр ViewModel был создан в представлении и также будет уничтожен)?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

"Я должен удалять наблюдателя каждый раз, когда представление, которое создает экземпляр ViewModel (с предыдущим кодом), было уничтожено, верно?"

Если вы наблюдаете LiveData в ViewModel с использованием observeForever(observer):

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

Если вы наблюдаете LiveData в Просмотр с использованием observe(lifecyclerowner, observer)

  • Наблюдатели будут автоматически удаляться платформой при уничтожении владельца жизненного цикла.


"Но не следует ли уничтожать наблюдателей после уничтожения представления (поскольку экземпляр ViewModel был создан в представлении и также будет уничтожен)?"

Этот вопрос больше относится к Java, чем к Android.

Подумайте о том, что значит "быть уничтоженным". Когда View Framework или ViewModel уничтожается платформой Android Framework, это не означает, что объект полностью удален из памяти. Ваши действия и фрагменты не будут собираться мусором, пока есть другие объекты (например, наблюдатель ), имеющие к ним ссылку.

Если вы вызываете observe(activity, observer), то Android Framework может отслеживать соединение между экземпляром activity и observer, и поэтому он может уничтожить observer, когда он хочет уничтожить activity. Однако, если вы просто позвоните observeForever(observer), у Android Framework просто не будет возможности определить, к какому объекту принадлежит этот наблюдатель.

0 голосов
/ 30 апреля 2019

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

Чтобы достичь этого, вы должны создать свою модель представления внутри Представления (Активность, Фрагмент) и наблюдать за такими данными в реальном времени

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
        model.getUsers().observe(this, Observer<List<User>>{ users ->
            // update UI
        })

, передавая this, вы привязываете данные наблюдения к жизненному циклу view's, поэтому, когда View (Activity, Fragment) будет уничтожен, и viewmodel, и наблюдатель будут уничтожены.

...