Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

【Android】LiveDataで値を監視する

LiveData は監視可能なデータホルダークラスです。通常の監視とは異なり、LiveDataAndroid のライフサイクルに応じた監視が可能です。つまり、アクティビティ、フラグメント、サービスなどの他のアプリコンポーネントのライフサイクルが考慮されます。

build.gradledependencies の設定は以下の通り。

// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")
// LiveData
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version")

ここでは、以下の2種類の LiveData を解説します。 - LiveData - MutableLiveData

LiveData

データが更新されたとき、監視者にそれを通知します。データを直接更新することはできません。

LiveData#observe

public void observe(LifecycleOwner owner, Observer<? super T> observer)

アクティビティやフラグメントなどの監視者が監視を開始します。引数 owner には監視者のライフサイクルオーナーを指定します。監視者がアクティビティのときは this を指定します。監視者がフラグメントのときは viewLifecycleOwner を指定します。これは、フラグメントのライフサイクルはアクティビティのそれとは異なり、不要な更新通知などを避けるためです。

以下は、フラグメントが LiveData を監視する場合の observe の使用方法です。

viewModel.count.observe(viewLifecycleOwner, {
    binding.countText.text = it.toString()
})

LiveData#getValue

public T getValue()

LiveData に格納されている値を取得します。

MutableLiveData

データが更新されたとき、観察者にそれを通知します。データを直接更新することができます。LiveData を継承しています。

一般的に、クラスのカプセル化を意識して、MutableLiveDataプロパティを非公開にし、LiveDataプロパティのみを公開します。

class MainViewModel : ViewModel() {
    private val _count = MutableLiveData(0)
    val count: LiveData<Int> get() = _count

MutableLiveData#setValue

public void setValue(T value)

MutableLiveData に値を設定します。メインスレッドから値を設定する場合に使用します。

MutableLiveData#postValue

public void postValue(T value)

MutableLiveData に値を設定します。ワーカースレッドから値を設定する場合に使用します。

参考

LiveData の概要