Когда использовать поля LiveData и Observable в Android?

Я реализую MVVM и привязку данных и пытаюсь понять, когда мне следует использовать поле Observable поверх LiveData?

Я уже просматривал различные документы и обнаружил, что LiveData учитывает жизненный цикл, но в примерах кода в Github эти два используются в ViewModel одновременно. Итак, я запутался, если LiveData лучше, чем поле Observable, почему бы вообще не использовать LiveData?

10
0
6 988
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать 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, и BaseObserver?

Khemraj Sharma 19.09.2018 08:46

Добавил пример.

Ahmed Ashraf 19.09.2018 13:23

Спасибо! Это отличное объяснение с примером. Итак, LiveData - это как поле Observable, которое можно использовать для привязки данных и с учетом жизненного цикла?

jjz 20.09.2018 13:20

Да, вы можете напрямую использовать LiveData в xml с привязкой данных, как показано здесь developer.android.com/topic/libraries/data-binding/architect‌ ure Я сам предпочитаю наблюдать LiveData из ViewModel в коде и использовать его значение в качестве модели привязки данных, выберите то, что вам больше всего подходит :)

Ahmed Ashraf 20.09.2018 14:57

LiveData - используйте с LifecycleOwner как действие или фрагмент

Наблюдаемый - использование с привязкой данных

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