📝

LiveData と Flow の違い

2024/11/27に公開

はじめに

ChatGPT先生に聞いてみました。
Androidアプリ開発でよく使われる LiveDataFlow
これらの違いを理解することで、プロジェクトに応じた最適な選択ができるようになります。本記事では、それぞれの特性や違いを徹底的に解説します!


ライフサイクルとの連携

LiveData

  • Androidライフサイクルに対応。
  • アクティビティやフラグメントがアクティブな間のみデータを配信。
  • メモリリークを防ぐ仕組みが内蔵。

Flow

  • ライフサイクル非依存。
  • 手動でライフサイクルの制御が必要。
  • バックグラウンド処理などに適している。

データの性質

LiveData

  • ホットデータストリーム(常にアクティブ)。
  • 状態を保持し、新しいオブザーバに直近の値を即座に配信。
  • UIデータの配信に最適。

Flow

  • コールドデータストリーム(必要に応じて開始)。
  • collect 呼び出し時に処理を開始。
  • 状態を保持せず、新しいストリームを生成。

非同期処理

LiveData

  • 非同期処理に弱く、工夫が必要。
  • Transformations.mapMediatorLiveData で簡単なデータ操作は可能。

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