[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()
, чтобы сделать что-то об этом)
AtomicBoolean progress = new AtomicBoolean();
observableOne
.filter(event -> !progress.get())
.flatMap(event ->
observableTwo
.doOnSubscribe(() -> progress.set(true))
.doOnTerminate(() -> progress.set(false))
.doOnError(error -> handleError(error))
.onErrorReturn(null)
.filter(data -> data != null)
)
.subscribe(data -> handleResponse(data));
Помните, что при необходимости используйте subscribeOn()
/observeOn()
с подходящими планировщиками.
Пожалуйста, используйте switchMap()
вместо flatMap()
-> если кнопка снова нажата, предыдущий вызов отменяется (отменяется подписка), а затем запускается новый. Или сказать это в терминах Rx: наблюдаемая две предыдущие подписки отписаны и сформирована новая подписка.
Если вы отключите свою кнопку при отмене подписки и включите ее при завершении, вы можете легко получить тот же результат, сделав кнопку незаметной.
Как правило, игнорировать предыдущие сетевые операции, если кнопка нажата несколько раз, - только при выполнении результатов сетевой операции для последнего нажатия кнопки. Почему вы решили игнорировать нажатия кнопок до завершения текущей сетевой операции? – Enigmativity
Вы, кажется, слишком усложняете проблему. Почему бы не отключить свою кнопку после того, как был получен щелчок и снова включить ее после работы с результатами сетевой операции? – JohnWowUs
Это всего лишь часть более сложной логики, есть причина для этого – Eugene