モケラ

Tech Sheets

mokelab

MutableLiveDataに値をセットする

最終更新日:2019-03-16

こちらで用意した MutableLiveData は、とても簡単に説明すると「監視可能なデータの入れ物」です。ここでは値を外からセットする方法を紹介します。

 val button = root.findViewById<Button>(android.R.id.button1)
 button.setOnClickListener {
    this.model.count.value = this.model.count.value!! + 1
 }

ボタンをタップするとカウントを増やす例です。MutableLiveData に値をセットするには setValue() を、セットされている値を取り出すには getValue() を使います。Kotlinの場合は上記の例のようにプロパティ構文が使えますが、初期値が設定されていない場合、 getValue()null を返すので注意しましょう。

なお、 setValue() はメインスレッドでしか呼べません。 AsyncTask のようなワーカースレッドから呼ぶと、次のような例外が発生します。

java.lang.IllegalStateException: Cannot invoke setValue on a background thread
    at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:461)
    at androidx.lifecycle.LiveData.setValue(LiveData.java:304)

ワーカースレッドから値をセットする場合は次のように postValue() を使います。

// AsyncTaskの中
override fun doInBackground(vararg params: Void?): Void? {
    model.count.postValue(model.count.value!! + 1)
    return null
}

一覧に戻る