"Я должен удалять наблюдателя каждый раз, когда представление, которое создает экземпляр 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 просто не будет возможности определить, к какому объекту принадлежит этот наблюдатель.