web-dev-qa-db-ja.com

データバインディングのLiveDataとObservableField

LiveDataとObservableFieldの違いに関連するStackoverflowに関する複数の質問があります。また、私はこのトピックについてインターネット上で複数の記事を見つけました。それらはすべて、LiveDataがObservableFieldとは異なりライフサイクルを認識していることを説明しています。それらのほとんどは、ActivityやFragmentなどのコンポーネントが属性を監視する場合、ObservableFieldの代わりにLiveDataを使用することが有利であると述べているため、サブスクライブを解除する必要はありません。

ただし、それをすべて読んだ後でも、データバインディングにObservableFieldよりもLiveDataを使用する利点があるかどうかは、私にはまだわかりません。例えば:

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を監視していると仮定しましょう。

私の質問は:

オプション1よりもオプション2を使用する利点はありますか、それともビュー(レイアウト)は存在するまで観察するだけなので、この場合は問題ではありませんか?

私をさらに混乱させるのは、この記事です: https://Android.jlelse.eu/Android-architecture-components-livedata-with-data-binding-7bf85871bbd8 これは次のように述べています: "以前のアプローチ(LiveDataなし)では、UIにデータを表示する場合は、データがまだ存在するかどうかを事前に確認する必要があります。LiveDataを使用すると、データは次の場合にのみ投稿されるため、心配する必要はありません。アクティビティは少なくとも開始されています(つまり、開始状態または再開状態です)。 "

私はこの引用された部分を理解していません。 ObservableFieldを使用する「以前のアプローチ」の場合にUIがまだ存在するかどうかを確認するとはどういう意味ですか?オプション1の私の例にこのチェックをどのように適用しますか?

10
1daemon1

ObservableFieldを使用してその変更を聞くと、どちらの場合も通知が届きます。

  1. アクティビティがユーザーに表示される場合。
  2. アクティビティが表示されていない場合(一時停止または破棄状態)。

このようなイベントの通知を受け取り、textViewなどのUIを変更する必要がある場合、ケース1はアクティビティが表示されるため正常に機能しますが、ケース2の場合、アクティビティが表示されないためUIを変更することはお勧めしません。また、次の場合にクラッシュする可能性があります。ビューが存在しません(アクティビティの終了状態のように)。

したがって、このケースを回避するために、2つのクラッシュと不要なデータ変更Live dataLive dataのように再生され、アクティビティが表示されている場合にのみ変更イベントが発生します。ライブデータオブザーバーは、アクティビティ/フラグメントのライフサイクルに従って機能します。したがって、ビューが呼び出されないオブザーバーとして、UIの更新前にビューが存在するかどうかを確認する必要はありません。

4
saksham