Я реализую MVVM и привязку данных и пытаюсь понять, когда мне следует использовать поле Observable поверх LiveData?
Я уже просматривал различные документы и обнаружил, что LiveData учитывает жизненный цикл, но в примерах кода в Github эти два используются в ViewModel одновременно. Итак, я запутался, если LiveData лучше, чем поле Observable, почему бы вообще не использовать LiveData?
Вы можете использовать LiveData все время, пока есть LifecycleOwner для наблюдения. Я предпочитаю сохранять связанные поля, которые относятся только к ViewModel, как Observable, и использовать LiveData для полей, изменения состояния которых также относятся к Activity или Fragment.
У обоих есть свои варианты использования, например:
Если вам нужен устойчивый к жизненному циклу контейнер для вашей модели состояния пользовательского интерфейса, LiveData - это то, что вам нужно.
Если вы хотите, чтобы пользовательский интерфейс обновлялся сам при изменении логики в вашей модели представления, используйте ObservableFields.
Я предпочитаю использовать комбинацию LivaData и ObservableField/BaseObservable, LiveData обычно ведет себя как контейнер данных с учетом жизненного цикла, а также как канал между виртуальной машиной и представлением.
С другой стороны, объекты модели состояния пользовательского интерфейса, которые передаются через LiveData, сами являются BaseObservable или имеют свои поля как ObservableField.
Таким образом, я могу использовать LiveData для полного изменения состояния пользовательского интерфейса.
И установите значения в полях модели состояния пользовательского интерфейса ObservableField всякий раз, когда требуется обновить небольшую часть пользовательского интерфейса.
Редактировать: Вот краткая иллюстрация, например, компонента UserProfile:
UIStateModel
data class ProfileUIModel(
private val _name: String,
private val _age: Int
): BaseObservable() {
var name: String
@Bindable get() = _name
set(value) {
_name = value
notifyPropertyChanged(BR.name)
}
var age: Int
@Bindable get() = _age
set(value) {
_age = value
notifyPropertyChanged(BR.age)
}
}
ViewModel
class UserProfileViewModel: ViewModel() {
val profileLiveData: MutableLiveData = MutableLiveData()
...
// When you need to rebind the whole profile UI object.
profileLiveData.setValue(profileUIModel)
...
// When you need to update a specific part of the UI.
// This will trigger the notifyPropertyChanged method on the bindable field "age" and hence notify the UI elements that are observing it to update.
profileLiveData.getValue().age = 20
}
Вид
Вы увидите, как профиль LiveData изменяется нормально.
XML
Вы будете использовать привязку данных для привязки модели состояния пользовательского интерфейса.
Редактировать: Теперь зрелый я предпочитает Неизменность вместо того, чтобы иметь изменяемые свойства, как объяснено в ответе.
Добавил пример.
Спасибо! Это отличное объяснение с примером. Итак, LiveData - это как поле Observable, которое можно использовать для привязки данных и с учетом жизненного цикла?
Да, вы можете напрямую использовать LiveData в xml с привязкой данных, как показано здесь developer.android.com/topic/libraries/data-binding/architect ure Я сам предпочитаю наблюдать LiveData из ViewModel в коде и использовать его значение в качестве модели привязки данных, выберите то, что вам больше всего подходит :)
LiveData - используйте с LifecycleOwner как действие или фрагмент
Наблюдаемый - использование с привязкой данных
Можете ли вы также показать небольшой пример, как вы предпочитаете использовать и
LiveData, иBaseObserver?