web-dev-qa-db-ja.com

AndroidのLiveDataおよびObservableフィールドをいつ使用するのですか?

MVVMとデータバインディングを実装していますが、LiveDataでObservableフィールドをいつ使用するべきかを理解しようとしていますか?

私はすでにさまざまなドキュメントを実行していて、LiveDataがライフサイクルに対応していることを発見しましたが、Githubのサンプルコードでは、これら2つがViewModelで同時に使用されています。それで、LiveDataがObservableフィールドより優れていると混乱しているのですが、LiveDataをまったく使用しないのはなぜですか?

7
jzarsuelo

どちらにも、たとえば次のようなユースケースがあります。

  • UI状態モデルのライフサイクルトレラントコンテナーが必要な場合は、LiveDataが答えです。

  • ロジックの一部がビューモデルで変更されたときにUI自体を更新する場合は、ObservableFieldsを使用します。

私自身はLivaDataObservableField/BaseObservableの組み合わせを使用することを好みます。LiveDataは通常、ライフサイクル対応のデータコンテナとして動作し、VMとビュー。

一方、LiveDataを介して出力されるUI状態モデルオブジェクトは、それ自体がBaseObservableであるか、フィールドがObservableFieldとして存在します。

そうすれば、UI状態の完全な変更にLiveDataを使用できます。また、UIの小さな部分を更新する場合は常に、UI状態モデルのObservableFieldフィールドに値を設定します。

Edit:次に、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 [〜#〜]

データバインディングを使用して、UI状態モデルをバインドします。

Edit:成熟した私は変更可能なプロパティを持つ代わりに Immutability を好むようになりました答えで説明したように。

4

LiveData-アクティビティやフラグメントのようなLifecycleOwnerでの使用

観察可能-データバインディングで使用

0
kreker

監視するLiveDataがある限り、いつでもLifecycleOwnerを使用できます。 ViewModelにのみ関連するバインドされたフィールドをObservableとして保持し、状態変化がLiveDataにも関連するフィールドにActivityを使用することを好みますFragment

0
Eddiel Lopez