Open4

Kotlin CoroutineのstateInオペレータで、SharingStartedの指定の仕方で、データ共有がどのように変わるか

stsnstsn

Kotlin Coroutine 1.5.0時点で、次の3種類がある

  • Eagerly
  • Lazily
  • WhileSubscribed
stsnstsn

Eagerly

定義された瞬間にデータの共有が始まる。

// この時点で、生産者(親)のデータ生成が開始する
val someFlow = flow.stateIn(started = SharingStarted.Eagerly, ...)

消費者がいなくてもデータの生成が開始する。

stsnstsn

Lazily

最初の消費者(collector、subscriber)が登録された時点で、データの共有が始まる。

// この時点で、生産者はデータ生成を開始しない
val someFlow = flow.stateIn(started = SharingStarted.Lazily, ...)


// この時点で、生産者はデータ生成を開始する
val job = someFlow.collect { ... }

// Lazilyの場合、一つでも消費者が登録されたら、
// すべての消費者の購読がキャンセルされても、生産者はデータ生成をストップしない
job.cancel()

消費者が登録された時点で、データの生成が開始する。

stsnstsn

WhileSubscribed

1つ以上の消費者が登録されている限り、データの共有をする。

// この時点で、生産者はデータ生成を開始しない
val someFlow = flow.stateIn(started = SharingStarted.WhileSubscribed(), ...)


// この時点で、生産者でデータ生成が開始する
val job = someFlow.collect { ... }

val job2 = someFlow.collect { ... }


// この時点で、生産者はデータ生成をストップしない
job.cancel()

// この時点で、生産者はデータ生成をストップする
job2.cancel()

subscriptionCountを見ており、消費者の登録が0になると、データの共有が終了する。