ad

rxjava:仅在给定期间的第一项时发出-英雄云拓展知识分享

匿名投稿 332 2024-01-22

我想以一种方式来转换我的源活动,使事件仅在指定期间内的第一项时才进行。

也就是说,我希望第一个项目可以经过,然后将所有后续项目抛弃,直到有10秒钟的时间为止,没有上游活动到达。

注意这也不

  • debounce:这将散发每一个项目,如果没有再出现10秒钟 - 但这将迫使第一个项目迫使10秒延迟。我想立即发出第一项。
  • throttleFirst:这将散发出第一项,然后将所有后续项目放在第一个项目以后10秒钟。我想在每一个上游项目以后重置禁止期。

我现在这样解决了:

source

rxjava:仅在给定期间的第一项时发出-英雄云拓展知识分享

.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)).


🚀🌟 点击注册 免费试用超级应用平台-英雄云企业级hpapaas 🌟🚀 😃👉🌐

免责声明:

本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。

标签:RX-JAVA RX-JAVA2
上一篇:找不到符号变量activity_main-英雄云拓展知识分享
下一篇:SASS地图输出-英雄云拓展知识分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×