Насколько интеллектуальна встроенная привязка данных Android? Будет ли он автоматически отменять регистрацию своих слушателей, когда это необходимо (например, при изменениях конфигурации, когда View разрушается), чтобы мне не пришлось беспокоиться о потерянных возможностях жизненного цикла? Или я должен смотреть Lifecycle of the View и отменять регистрацию его слушателей? (= делать вручную то, что обычно делает для меня LiveData).
Итак, я провел несколько тестов. Я реализовал androidx.databinding.Observable
на своем ViewModel
и изменил конфигурацию со следующими вызовами журнала:
override fun removeOnPropertyChangedCallback(
callback: androidx.databinding.Observable.OnPropertyChangedCallback?) {
Log.d("APP:EVENTS", "removeOnPropertyChangedCallback " + callback.toString())
}
override fun addOnPropertyChangedCallback(
callback: androidx.databinding.Observable.OnPropertyChangedCallback?) {
Log.d("APP:EVENTS", "addOnPropertyChangedCallback " + callback.toString())
}
Я видел, что addOnPropertyChangedCallback
вызывался каждый раз, когда на мою модель представления ссылались в выражении привязки макета , И ни разу я не видел, как вызывали removeOnPropertyChangedCallback
. Мой первоначальный вывод заключается в том, что привязка данных AndroidX является глупой и не приводит к автоматическому удалению слушателя.
FYI: тип обратного вызова был ViewDataBinding.WeakPropertyListener
Однако я Взглянул на ViewDataBinding.java
исходный код и обнаружил, что он использует Слабые ссылки для добавления прослушивателя.
Так что это означает, что при конфигурации измените, Android ОС должна быть в состоянии собрать мусор из вашей Деятельности / Фрагмента, потому что у модели представления нет сильной ссылки.
Мой совет: не добавляйте шаблон для отмены регистрации слушателей. Android не будет пропускать ссылки на ваши действия и фрагменты при изменениях конфигурации .
Теперь, если вы решите не использовать LiveData
, подумайте над тем, чтобы ваша модель представления реализовала LifecycleObserver
, чтобы вы могли повторно -испускать последнее значение, когда ваша активность / фрагмент переходит в активное состояние. Это ключевое поведение, которое вы теряете, если не используете LiveData
. В противном случае вы можете отправлять уведомления, используя PropertyChangeRegistry.notifyCallbacks()
, как указано в документации, которую вы предоставили в другой раз. К сожалению, я думаю, что это можно использовать только для уведомления о всех свойствах.
Другое дело ... хотя я не проверял поведение, исходный код, похоже, указывает на то, что слабые ссылки используются для ObservableField
, ObservableList
, ObservableMap
и др. c.
LiveData
отличается по нескольким причинам:
- )" rel="nofollow noreferrer"> В документации для
LiveData.observe
говорится, что строгая ссылка поддерживается как для наблюдателя, так и для жизненного цикла владелец, пока владелец жизненного цикла не будет уничтожен. LiveData
испускает иначе, чем ObservableField
. LiveData
будет излучаться всякий раз, когда вызывается setValue
или postValue
независимо от того, действительно ли значение изменяется. Это не верно для ObservableField
. По этой причине LiveData
может использоваться для отправки «псевдо-события» путем установки одного и того же значения более одного раза. Пример того, где это может быть полезно, можно найти на странице Условная навигация , где несколько сбоев при входе в систему приводят к появлению нескольких «закусочных».