📝
LiveData と Flow の違い
はじめに
ChatGPT先生に聞いてみました。
Androidアプリ開発でよく使われる LiveData
と Flow
。
これらの違いを理解することで、プロジェクトに応じた最適な選択ができるようになります。本記事では、それぞれの特性や違いを徹底的に解説します!
ライフサイクルとの連携
LiveData
- Androidライフサイクルに対応。
- アクティビティやフラグメントがアクティブな間のみデータを配信。
- メモリリークを防ぐ仕組みが内蔵。
Flow
- ライフサイクル非依存。
- 手動でライフサイクルの制御が必要。
- バックグラウンド処理などに適している。
データの性質
LiveData
- ホットデータストリーム(常にアクティブ)。
- 状態を保持し、新しいオブザーバに直近の値を即座に配信。
- UIデータの配信に最適。
Flow
- コールドデータストリーム(必要に応じて開始)。
-
collect
呼び出し時に処理を開始。 - 状態を保持せず、新しいストリームを生成。
非同期処理
LiveData
- 非同期処理に弱く、工夫が必要。
-
Transformations.map
やMediatorLiveData
で簡単なデータ操作は可能。
Flow
- Kotlinコルーチンと統合。
-
map
,filter
,combine
,flatMap
など多彩な演算子が使用可能。
エラーハンドリング
LiveData
- 内蔵のエラーハンドリング機能はなし。
- try-catch を使った対応が一般的。
Flow
-
catch
演算子でエラーハンドリングが可能。 - 再試行(
retry
)機能もサポート。
使用ケース
LiveData | Flow |
---|---|
UIコンポーネントと簡単に統合したい場合 | 複雑なデータ操作や非同期処理が必要な場合 |
ライフサイクルを気にせず使いたい場合 | 状態を保持しないデータ処理をしたい場合 |
簡単なリアクティブデータバインディング | 非同期処理や連続したデータストリーム |
実際のコード例
LiveData
val liveData = MutableLiveData<String>()
fun updateData(value: String) {
liveData.value = value
}
// Observer
liveData.observe(viewLifecycleOwner) { value ->
println("Observed: $value")
}
Flow
val flow = flow {
emit("Hello")
delay(1000)
emit("World")
}
// Collector
lifecycleScope.launch {
flow.collect { value ->
println("Collected: $value")
}
}
まとめ
-
簡単なUIデータ管理 →
LiveData
-
非同期処理や高度なデータストリーム操作 →
Flow
どちらも適材適所で使い分けるのがポイントです。現在では、Googleが Flow
の利用を推奨しているため、新しいプロジェクトでは Flow
がよりモダンで柔軟な選択肢となります。
Discussion