无UI中的RECTIVEX在RECTIVEX中-英雄云拓展知识分享
332
2024-01-22
我想以一种方式来转换我的源活动,使事件仅在指定期间内的第一项时才进行。
也就是说,我希望第一个项目可以经过,然后将所有后续项目抛弃,直到有10秒钟的时间为止,没有上游活动到达。
注意这也不
debounce
:这将散发每一个项目,如果没有再出现10秒钟 - 但这将迫使第一个项目迫使10秒延迟。我想立即发出第一项。throttleFirst
:这将散发出第一项,然后将所有后续项目放在第一个项目以后10秒钟。我想在每一个上游项目以后重置禁止期。我现在这样解决了:
source
.flatMap { Flowable.just(1).concatWith(Flowable.just(⑴).delay(10, TimeUnit.SECONDS)) }
.scan(0, { x, y -> x + y })
.map { it > 0 }
.distinctUntilChanged()
.filter { it }
注意:我不在意 source
,只有它们产生 - 但是,固然,我可以将这些物品包裹在一个 Pair
随着 1
或 ⑴
).
是不是有一种更简单的方法来使用内置RXJAVA(2)操作员实现相同的目标?
经过使用以下事实 switchMap
仅定阅一个 Flowable
立即便用布尔来检查是不是必须发出:
class ReduceThrottle<T>(val period: Long, val unit: TimeUnit) : FlowableTransformer<T, T> {override fun apply(upstream: Flowable<T>): Publisher<T> {
return Flowable.defer {
val doEmit = AtomicBoolean(true)
upstream.switchMap { item ->
val ret = if (doEmit.compareAndSet(true, false)) {
// We haven't emitted in the last 10 seconds, do the emission
Flowable.just(item)
} else {
Flowable.empty()
}
ret.concatWith(Completable.timer(period, unit).andThen(Completable.fromAction {
// Once the timer successfully expires, reset the state
doEmit.set(true)
}).toFlowable())
}
}
}
}
然后,这只是利用变压器的问题: source.compose(ReduceThrottle(10, TimeUnit.SECONDS))
.
免责声明:
本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。
发表评论
暂时没有评论,来抢沙发吧~