🤔

MutableStateFlowとMutableLiveDataの違い: MVVMパターンにおける視点から

2023/06/27に公開

はじめに

Androidアプリを作りながらMutableStateFlowとMutableLiveDataの違いについて使い分けがよくわからなかったので。自分なりに調べた結果をまとめてみます。
これらはどちらもデータの変更を監視するためのクラスですが、それぞれが持つ特性は異なります。

MutableLiveDataとは?

MutableLiveDataはAndroid Jetpackライブラリの一部で、ライフサイクルに統合されたデータ保持クラスです。LiveDataは観察可能なデータホルダークラスで、クラスがライフサイクル状態の変更を観察できるため、UIコンポーネント(アクティビティやフラグメントなど)のライフサイクルに安全に統合できます。これは、アクティビティやフラグメントがアクティブでないとき(つまり、バックグラウンドにあるときや破棄されるとき)には更新を受け取らないことを意味します。

MutableStateFlowとは?

一方、MutableStateFlowはKotlinのFlow APIの一部で、Kotlinのコルーチンと密接に統合されています。MutableStateFlowは、最新の値を持つ状態ホルダーで、その値の変更をFlowとして表現します。これにより、非同期データの変更をより効率的に扱うことができます。

MVVMパターンにおける違い

MVVMパターンにおいて、これらのクラスをどのように使用するかは非常に重要です。MutableLiveDataはライフサイクル意識的なため、ViewModelからActivityやFragmentへのデータバインディングを簡単に実現できます。一方、MutableStateFlowはライフサイクルには無関係ですが、一般的にはより強力で柔軟なストリーム処理を提供します。

最も大きな違いは、MutableStateFlowがスレッドセーフであり、同時に複数のスレッドから安全に変更することができるのに対し、MutableLiveDataの値は主スレッドからのみ変更することができることです。さらに、MutableStateFlowはバッファリングを提供せず、常に最新の値だけが提供されます。これは、UI更新を行う場合や、多数の変更が同時に発生する可能性がある場合に特に有用です。

また、MutableStateFlowとMutableLiveDataは、デフォルトで最新の値を保存するかどうかにも違いがあります。MutableStateFlowは初期値を必要とし、常に最新の値を提供します。一方、MutableLiveDataは初期値を必要とせず、最新の値がない場合は何も提供しません。

ユースケース

結論、現状JetpackComposeを用いた開発においてはMutableStateFlow 一択で問題ありません。
これまでMutableLiveDataが使われてた背景として、元々androidはxmlでviewの双方向bindingをLiveDataを使って行ってたという背景があります、
それがJetpackComposeができたことによってcomposableなviewの作成が可能になったことと
Composeが使うものがStateFlowになったことによりLiveData -> StateFlowになったという感じです
なので

  • 既存のプロジェクトでLiveDataを既に使っている
  • 何かのライブラリを使っていてそれがLiveDataに依存してしまっている

とかでない限りはLiveDataを新しく使うことはほぼないと思います。
LiveDataを使っているプロジェクトはLiveDataをStateFlowに変換してComposeを使うことができ、
逆にStateFlowをLiveDataに変換してLiveDataに依存しているものに適用することもできます。

Arsaga Developers Blog

Discussion