MutableStateFlowとMutableLiveDataの違い: MVVMパターンにおける視点から
はじめに
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に依存しているものに適用することもできます。
アルサーガパートナーズ株式会社のエンジニアによるテックブログです。11月14(木)20時〜 エンジニア向けセミナーを開催!詳細とご応募は👉️ arsaga.jp/news/pressrelease-cheer-up-project-november-20241114/
Discussion