Kotlin协程相关记录

30 阅读1分钟

1. Flow combinezip

  • combine 组合的值,有任何更新,都会调用;
  • zip 则是 1:1 对应时,才更新。

2. supervisorScopecoroutineScope

  • coroutineScope,它不允许子协程失败,父协程会失败,异常会向上传递,导致其他协程也会失败。
  • supervisorScope,它允许子协程失败,不会影响父协程;

3. asyncDeferred<T>

  • async 是挂起函数,返回一个 Deferred<T> 对象, await() 等待返回结果;
  • 使用CompletableDeferred<T> 返回结果,将常规的 Java回调 改成 await 模式,complete(T) completeExceptionally(Throwable)

4. suspendCoroutinesuspendCancellableCoroutine

  • suspendCoroutine 一般将 Java回调 改造成 挂起函数;
  • suspendCancellableCoroutine 则是支持 取消操作, invokeOnCancellation {}方法,在取消时调用;
  • Continuation<T> 则是处理返回结果,resume(T)resumeWithException(Throwable) 结果或异常。

5. Flow SharedFlow 和 StateFlow

  • Flow 默认是冷流,每次 collect() 才会执行实际请求,不缓存结果;
  • SharedFlow 支持配置 保存数据数量,丢弃策略 DropOldest/DropLatest;
  • StateFlow 热流,保存最后一次的状态。

MutableSharedFlow

public fun <T> MutableSharedFlow(
    replay: Int = 0,
    extraBufferCapacity: Int = 0,
    onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND
)
  1. replay 新订阅时,收到的数据数量;
  2. extraBufferCapacity 除了replay之外,额外的缓存数量;超出时,emit 可能挂起;
  3. 当超出 extraBufferCapacity 时,触发策略 挂起丢弃旧数据丢弃新数据

BufferOverflow 丢弃策略

  1. BufferOverflow.SUSPEND 缓冲区满时,挂起;
  2. BufferOverflow.DROP_OLDEST 缓冲区满时,丢弃最老的数据;
  3. BufferOverflow.DROP_LATEST 缓冲区满时,丢弃最新的数据。