【Kotlin/Android】MutableLiveDataのpostValueの使い方!setValueとの違いと注意点
この記事からわかること
- Android Studio/KotlinのMutableLiveDataの使い方
- postValueメソッドの役割
- setValueとの違いと注意点
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス:LiveData
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
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
に値を渡す方法ですがこれにはpostValue
とsetValue
メソッド(valueプロパティに格納)の2つの方法が存在します。両者には大きく違うポイントがあるのでそれぞれの役割を整理していきます。
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)
からでも即座に値を取得することが可能です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。