📝
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