LiveData и ObservableField для привязки данных - PullRequest
0 голосов
/ 18 декабря 2018

Существует несколько вопросов по Stackoverflow, связанных с различием между LiveData и ObservableField.Кроме того, я нашел несколько статей в Интернете на эту тему.Все они объясняют, что LiveData поддерживает жизненный цикл в отличие от ObservableField.Большинство из них также упоминают, что выгодно использовать LiveData вместо ObservableField, если компонент, такой как Activity или Fragment, наблюдает атрибут, поэтому нам не нужно отписываться.

Однако даже после прочтения всего этого,что мне до сих пор неясно, есть ли какое-либо преимущество использования LiveData над ObservableField для привязки данных.Например:

ViewModel:

class UserViewModel(user: User) : ViewModel {
    val userName = ObservableField<String>(user.name) // Option 1
    val userName = MutableLiveData<String>(user.name) // Option 2
}

Макет:

<layout>
    <data>
        <variable name="viewModel" type="com.example.UserViewModel" />
    </data>
    ...
</layout>

Для варианта 2 мне также, конечно, придется использовать binding.setLifecycleOwner(activity).Давайте предположим, что ничего кроме макета не наблюдается userName.

Мои вопросы:

Есть ли преимущество использования варианта 2 по сравнению с вариантом 1 или это не имеет значения в этом случае, так какпредставление (макет) будет просто наблюдать, пока оно не существует?

Что меня еще больше смущает, так это статья: https://android.jlelse.eu/android-architecture-components-livedata-with-data-binding-7bf85871bbd8, в которой говорится: "В предыдущем подходе (без LiveData), если мыЧтобы показать данные в пользовательском интерфейсе, мы должны предварительно проверить, существуют ли они по-прежнему. С LiveData нам не нужно беспокоиться об этом, потому что данные будут публиковаться, только если активность хотя бы запущена (то есть в запущенном или возобновленном состоянии)."

Я не понимаю эту цитируемую часть.Что подразумевается под проверкой, если пользовательский интерфейс все еще существует в случае «предыдущего подхода», который использует ObservableField?Как бы вы применили эту проверку для моего примера в варианте 1?

1 Ответ

0 голосов
/ 10 января 2019

Когда вы используете ObservableField и слушаете его изменения, вы получаете уведомление в обоих случаях:

  1. Когда активность видна пользователю.
  2. Когда активностьне видно (в состоянии паузы или уничтожения).

теперь, когда вы получаете уведомление о таком событии, и вам нужно изменить пользовательский интерфейс, такой как textView и т. Д., Случай 1 будет работать нормально, так как активность видна, но в случае 2 не рекомендуется изменять интерфейс в качестве действияневидим, а также может произойти сбой, если представление не существует (например, состояние завершения действия).

, так что здесь, чтобы избежать этого случая, 2 сбоя и нежелательные изменения данных Live data начинает действовать, как в Live data вы получите изменения событий, только если активность видна.Наблюдатели в реальном времени работают в соответствии с жизненным циклом действия / фрагмента.Поэтому вам не нужно проверять, существует ли представление перед обновлением пользовательского интерфейса, так как наблюдатель сам не вызвал.

...