[Android] 025. Flow

わかりやすい説明してくれている人たくさんいるのでとりあえず自分向けのメモ書きレベル

Flow

developerの説明は以下
https://developer.android.com/kotlin/flow?hl=ja

とりあえずここらへん見ればなんとなく理解できます
https://speakerdeck.com/sys1yagi/5fen-tewakarukotlin-coroutines-flow
https://qiita.com/mi_iroha/items/78721a53cb113a82a1b1

ざっくり言うと…

・Flowはコルーチンの一種でコルーチンにはワンショット/ホットストリーム/コールドストリームがあるがFlowはコールドストリーム

・ワンショット
コルーチンを一度だけ実行し再利用できない

・ホットストリーム
常に定期的なデータの生成や更新が行われる

・コールドストリーム
要求があるまでデータを生成しない

ワンショットlaunch, Job戻値なし
ワンショットasync, Deferred戻値あり
ホットストリームChannel, (StateFlow / SharedFlow)複数の値
コールドストリームFlow複数の値

StateFlow / SharedFlow

StateFlowはSharedFlowのサブクラスでSharedFlowは複数箇所でのSubscribeでデータや状態を共有できるFlow、StateFlowは状態保持に特化したSharedFlowでLiveDataに似た機能です

developerの説明は以下
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow?hl=ja

ここらへんが参考になるかも
https://at-sushi.work/blog/24/

StateFlow / MutableStateFlow

FlowをStateFlowに変換するにはstateInを使います
StateFlowにすることでホットストリーム化します

stateInの引数のstartedに指定するSharingStartedについては以下にわかりやすい説明がありましたので引用します

SharingStartedとは stateIn()の第二引数にはSharingStartedを指定します。
このSharingStartedとは、共有コルーチンを開始、および終了させるためのストラテジーであるとドキュメントでは説明されています。
組み込みストラテジーのセットとしてEagerly、Lazily、WhileSubscribedの3つのストラテジーが提供されています。

SharingStarted.Eagerlyとは SharingStarted.Eagerlyを指定した場合は、stateIn()を呼び出したタイミングで値の生成を開始します。注意点としてはコンシューマー側でcollectAsState()を呼び出したタイミングによって、最初にemit()された値などを取得できない可能性があります。

SharingStarted.Lazlyとは SharingStarted.Lazylyを指定した場合は、最初にコンシューマー側によってcollectAsState()が呼び出されたタイミングで値を生成します。これにより、最初に取得しようとしたコンシューマーは今までに発行されたすべての値を取得することが保証されます。

SharingStarted.WhileSubscribedとは SharingStarted.WhileSubscribedは、最初にコンシューマー側によってcollectAsState()が呼び出されたタイミングで値を生成します。しかし他のオプションと違い、cancel()などが呼び出されることにより、値を必要としているコンシューマー側の数が0になった時点で値の生成を辞めますので注意が必要です。

https://qiita.com/takagimeow/items/2271c8a843b8caf92ebe

仕様は以下で確認
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-sharing-started/-companion/

Roomの記事でSharingStarted.WhileSubscribedの引数がなぜ5000なのかはdeveloper blogにありました

ほとんどの場合、最後のコレクターが消失した後、さらに 5 秒間上流フローをアクティブに維持します。これにより、構成変更などの特定の状況でアップストリーム フローが再起動されるのを回避できます。このヒントは、アップストリーム フローの作成にコストがかかる場合、およびこれらの演算子が ViewModel で使用される場合に特に役立ちます。

https://medium.com/androiddevelopers/things-to-know-about-flows-sharein-and-statein-operators-20e6ccb2bc74

SharedFlow / MutableSharedFlow

FlowをStateFlowに変換するにはshardInを使います


Android Studio Giraffe 2022.3.1 Patch 1 built on August 17, 2023