[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