【Kotlin/Android】MutableLiveDataのpostValueの使い方!setValueとの違いと注意点

この記事からわかること

  • Android Studio/KotlinMutableLiveData使い方
  • postValueメソッド役割
  • setValueとの違い注意点

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:LiveData

環境

MutableLiveDataでvalue(値)を変更する方法

データの変更を監視するためにMutableLiveData型を使用している場合は実際の値を参照するためにはvalueプロパティ(#getvalue)を参照します。その際にvalueプロパティはnullableになるのでエルビス演算子を使って代替値などを渡す必要があります。

おすすめ記事:【Kotlin/Android】nullをチェックする方法!早期returnとエルビス演算子

class MyViewModel: ViewModel() {
    private val _counter: MutableLiveData<Int> = MutableLiveData<Int>(0)

    public fun getValue() :<Int> {
      // nullableなので ?: でnullだった場合の対処が必要
      return _counter.value ?: 0
    }
}

ではそもそもvalueに値を渡す方法ですがこれにはpostValuesetValueメソッド(valueプロパティに格納)の2つの方法が存在します。両者には大きく違うポイントがあるのでそれぞれの役割を整理していきます。

postValueメソッド

公式リファレンス:postValueメソッド

postValueバックグラウンドスレッドから値を変更する非同期的なメソッドです。UIスレッドからも呼び出すことも可能ですが、非同期であるためタイミングにズレが生じ、期待通りにUIと同期させることができない場合があるので注意が必要です。

使用想定はDBからデータを取得する場合など非同期的にデータを取得し、MutableLiveDataに反映させたい場合などです。

public fun updateCount() {
    viewModelScope.launch(Dispatchers.IO) {
        _counter.postValue(2)
    }
}

postValueメソッドの特徴としてオブザーバーから観測している場合は正常にvalueプロパティ(#getvalue)から値を取得できますが、バックグラウンドスレッドから値を参照しても取得することはできません。そのため以下のように値を取得しようとしても2を取得することはできません。

public fun updateCount() {
    viewModelScope.launch(Dispatchers.IO) {
        _counter.postValue(2)
        Log.e("postValue", _counter.value?.toString())
    }
}

setValueメソッド

setValueメインスレッドから値を変更する同期的なメソッドです。バックグラウンドスレッドからも呼びだすことは可能ですがメインスレッドでの使用が推奨されています。

public fun updateCount() {
  _counter.setValue(2)
  // kotlinでは以下の記法が使える
  _counter.value = 2
}

メインスレッドで同期的に値を設定するので即座に変更は伝えられるのでvalueプロパティ(#getvalue)からでも即座に値を取得することが可能です。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index