SharedFlowとは?

特徴

  • ホットFlow
  • MutableSharedFlowではemit関数を使って値をFlowに流すことができる

SharedFlowのrepaly

  • replayを使うとcollect前に流れたデータを新しいサブスクライバに送信することができる
  • replayの設定方法は2通りある
    1. sharedIn関数でreplayを指定する方法
    2. MutableSharedFlowのコンストラクタでreplayを指定する方法
  • replayCacheを使うことで現在のreplayのスナップショットを取得できる
  • MutableSharedFlow#resetReplayCache関数を使うことでreplayCacheをリセットできる

SharedFlowのBufferOverflow

  • 処理が遅いサブスクライバがいても、エミッターが遅延しないようにする仕組み
  • BufferOverflowの設定方法は2通りある
    1. buffer関数のcapacityでバッファサイズを、onBufferOverflowでバッファオーバーフロー時の動作を指定する方法
    2. MutableSharedFlowのコンストラクタで、(replay + extraBufferCapacity)でバッファサイズを、onBufferOverflowでバッファオーバーフロー時の動作を指定する方法
  • onBufferOverflwに指定する値は、BufferOverflow.SUSPENDBufferOverflow.DROP_LATESTBufferOverflow.DROP_OLDESTの3種類

BufferOverflow.SUSPEND

  • バッファサイズを超えたらサブスクライバの処理が完了するまでエミッターが一時停止する。

BufferOverflow.DROP_LATEST

  • バッファサイズを超えたら、バッファに追加しようとした今来た最も新しい値を捨てて今までのバッファと同じ内容を保持する

BufferOverflow.DROP_OLDEST

  • バッファサイズを超えたら、バッファ内の最も古い値を捨てて、新しい値をバッファに追加する

bufferサイズの指定方法

  • bufferサイズの設定方法は2通りある
    1. buffer関数でcapacityで設定する方法
    2. sharedIn関数または、MutableSharedFlowのコンストラクタで指定された、replayとextraBufferCapacityの合計値で設定する方法

MutableSharedFlowの初期値

  • 何もコンストラクタで指定せずにMutableSharedFlowを作成した場合

    public fun <T> MutableSharedFlow(
      replay: Int = 0,
      extraBufferCapacity: Int = 0,
      onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND
    ): MutableSharedFlow<T>
    

    上記のようになるので、replayもbufferも無くサブスクライバの処理が遅延していたら待たされることになります。