Kotlin Flowable concatMapSingle无需预取即可忽略点击,直到处理完成

Kotlin Flowable concatMapSingle无需预取即可忽略点击,直到处理完成,kotlin,rx-java2,Kotlin,Rx Java2,我想以这样一种方式来处理点击,只要我在处理发生的点击,它们就会被忽略 我想我可以通过利用背压来实现,就像这样: private val clicks = PublishProcessor.create<Unit>() // ... clicks .onBackpressureDrop() .concatMapSingle(::handleClick, 0) 但这会引发一个错误,因为需要concatMapSingle至少预取一个项目,这使得它在我完成处理后立即对单

我想以这样一种方式来处理点击,只要我在处理发生的点击,它们就会被忽略

我想我可以通过利用背压来实现,就像这样:

private val clicks = PublishProcessor.create<Unit>()

// ...

clicks
    .onBackpressureDrop()
    .concatMapSingle(::handleClick, 0)
但这会引发一个错误,因为需要concatMapSingle至少预取一个项目,这使得它在我完成处理后立即对单击进行排队并处理,这不是我想要的。我只想在当前没有处理的情况下处理单击

是否有其他操作符可以用来实现所需的效果?

使用flatMapSingle而不是concatMapSingle可以达到以下效果:

如果当前项目实际完成,flatMap将仅获取下一个上游项目

最后一个参数是maxConcurrency,指定对SingleSources的最大活动订阅数:

在本例中,flatMapSingle按顺序订阅这些单体,因此它不会更改我从concatMapSingle获得的语义。

使用flatMapSingle而不是concatMapSingle可以做到这一点:

如果当前项目实际完成,flatMap将仅获取下一个上游项目

最后一个参数是maxConcurrency,指定对SingleSources的最大活动订阅数:


在本例中,flatMapSingle按顺序订阅这些单体,因此它不会更改我从concatMapSingle获得的语义。

为什么不在开始处理单击之前简单地禁用按钮?UI中没有禁用状态,因此用户不会注意到任何差异。而且,我从来没有说过这是一个按钮;任何其他可点击的。如果没有禁用状态,禁用单击和忽略单击之间没有区别,是吗?我认为在UI中禁用单击时可能存在竞态条件,而忽略单击时则不存在竞态条件。此外,如果我能在演示者中轻松处理,为什么要将视图添加到MVP合同中?为什么不在开始处理单击之前禁用按钮?UI中没有禁用状态,因此用户不会注意到任何差异。而且,我从来没有说过这是一个按钮;任何其他可点击的。如果没有禁用状态,禁用单击和忽略单击之间没有区别,是吗?我认为在UI中禁用单击时可能存在竞态条件,而忽略单击时则不存在竞态条件。另外,如果我能在演示者中轻松处理它,为什么还要将视图添加到MVP合同中呢。
clicks
    .onBackpressureDrop()
    .flatMapSingle(::handleClick, false, 1)