1. Flow combine 和 zip
combine 组合的值,有任何更新,都会调用;
zip 则是 1:1 对应时,才更新。
2. supervisorScope 和 coroutineScope
coroutineScope,它不允许子协程失败,父协程会失败,异常会向上传递,导致其他协程也会失败。
supervisorScope,它允许子协程失败,不会影响父协程;
3. async 和 Deferred<T>
async 是挂起函数,返回一个 Deferred<T> 对象, await() 等待返回结果;
- 使用
CompletableDeferred<T> 返回结果,将常规的 Java回调 改成 await 模式,complete(T) completeExceptionally(Throwable)
4. suspendCoroutine 和 suspendCancellableCoroutine
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
)
replay 新订阅时,收到的数据数量;
extraBufferCapacity 除了replay之外,额外的缓存数量;超出时,emit 可能挂起;
- 当超出
extraBufferCapacity 时,触发策略 挂起、丢弃旧数据,丢弃新数据。
BufferOverflow 丢弃策略
BufferOverflow.SUSPEND 缓冲区满时,挂起;
BufferOverflow.DROP_OLDEST 缓冲区满时,丢弃最老的数据;
BufferOverflow.DROP_LATEST 缓冲区满时,丢弃最新的数据。