[EDIT2]改变,所以我适应我的答案+实际上给一个正确的答案
我看不出这样做比用状态标志的其他方式的问题:
AtomicBoolean progress = new AtomicBoolean();
observableOne
.filter(event -> !progress.get())
.flatMap(event ->
observableTwo
.doOnSubscribe(() -> progress.set(true))
.doOnTerminate(() -> progress.set(false))
)
.subscribe();
如果发生错误时,您的订阅将被取消,即使再次单击该按钮,也不会再收到任何事件。
如果这不是你想要的,你可以:在错误回调
private void bindRemoteCalls() {
if (mySubscription != null) mySubscription.unsubscribe();
AtomicBoolean progress = new AtomicBoolean();
mySubscription = observableOne
.filter(event -> !progress.get())
.flatMap(event ->
observableTwo
.doOnSubscribe(() -> progress.set(true))
.doOnTerminate(() -> progress.set(false))
)
.flatMap(event -> observableTwo, 1)
.subscribe(
data -> handleResponse(data),
error -> {
handleError(error);
bindRemoteCalls();
}
);
}
使用onErrorReturn()
(用doOnError()
结合实际做一些事情)
如果您需要,请记得使用subscribeOn()
/observeOn()
以及正确的调度程序。
请考虑用switchMap()
代替flatMap()
- >如果再次按下该按钮,先前的呼叫被取消(取消订阅),然后开始新的呼叫。或者用Rx来表示:observableTwo先前的订阅已取消订阅,并且形成了新的订阅。
如果您在取消订阅时禁用了您的按钮并在终止时启用了它,您可以通过使按钮不可点击来轻松获得相同的结果。
如果多次单击按钮,通常会忽略先前的网络操作 - 只会在最后一次按钮单击时获取网络操作的结果。为什么选择忽略按钮点击直到当前的网络操作完成? – Enigmativity
你似乎已经结束了这个问题。为什么不在收到点击后禁用按钮,并在处理网络操作结果后重新启用它? – JohnWowUs
这只是更复杂的逻辑的一部分,有一个原因 – Eugene