如何从高频更新的Flow中按固定延迟发送最新值?
解决方案:使用Flow的sample操作符
直接用sample操作符就能满足你的需求——它会按照指定的时间间隔,定期采集原Flow的最新值并发射,完全匹配你要的「每300ms发送原Flow最新值」的逻辑。
实现代码
// 高频更新的Flow(每50ms更新) val orientationFlow = merge(_orientationFlow, locationFlow) // 每300ms发送一次原Flow的最新值 val cameraBearingFlow = orientationFlow.sample(300)
为什么之前的方案不适用
- debounce:这个操作符的逻辑是「等待指定时长内没有新值产生,才发射最后一个值」。你的原Flow每50ms就更新一次,永远触发不了300ms的静默期,所以完全不会发射任何值,不符合需求。
- onEach + delay:这种写法会给每个原Flow的值都加上300ms延迟,导致最终发射的是300ms前的旧值,而不是当前时刻的最新值,也不符合要求。
自定义实现(如果sample无法满足特殊需求)
如果需要更灵活的控制,可以结合stateIn和flow { ... }手动实现:
val orientationStateFlow = orientationFlow.stateIn( scope = yourCoroutineScope, started = SharingStarted.WhileSubscribed(), initialValue = initialOrientationValue // 替换成你的初始值 ) val cameraBearingFlow = flow { while (true) { delay(300) emit(orientationStateFlow.value) } }
这个写法是先把原Flow转成StateFlow保存最新值,然后每隔300ms读取并发射最新值,效果和sample一致,但适合需要额外逻辑的场景。
内容的提问来源于stack exchange,提问作者SoulReaver313
相关产品推荐
相关产品推荐

