Open4
Kotlin CoroutineのstateInオペレータで、SharingStartedの指定の仕方で、データ共有がどのように変わるか
Kotlin Coroutine 1.5.0時点で、次の3種類がある
- Eagerly
- Lazily
- WhileSubscribed
Eagerly
定義された瞬間にデータの共有が始まる。
// この時点で、生産者(親)のデータ生成が開始する
val someFlow = flow.stateIn(started = SharingStarted.Eagerly, ...)
消費者がいなくてもデータの生成が開始する。
Lazily
最初の消費者(collector、subscriber)が登録された時点で、データの共有が始まる。
// この時点で、生産者はデータ生成を開始しない
val someFlow = flow.stateIn(started = SharingStarted.Lazily, ...)
// この時点で、生産者はデータ生成を開始する
val job = someFlow.collect { ... }
// Lazilyの場合、一つでも消費者が登録されたら、
// すべての消費者の購読がキャンセルされても、生産者はデータ生成をストップしない
job.cancel()
消費者が登録された時点で、データの生成が開始する。
WhileSubscribed
1つ以上の消費者が登録されている限り、データの共有をする。
// この時点で、生産者はデータ生成を開始しない
val someFlow = flow.stateIn(started = SharingStarted.WhileSubscribed(), ...)
// この時点で、生産者でデータ生成が開始する
val job = someFlow.collect { ... }
val job2 = someFlow.collect { ... }
// この時点で、生産者はデータ生成をストップしない
job.cancel()
// この時点で、生産者はデータ生成をストップする
job2.cancel()
subscriptionCountを見ており、消費者の登録が0になると、データの共有が終了する。