You are looking for debounce
operator:
Returns an Observable that mirrors the source ObservableSource, except that it drops items emitted by the source ObservableSource that are followed by newer items before a timeout value expires. The timer resets on each emission.
Just wrap your click events into Observable
:
Observable<Object> getButtonObservable(final Button button) {
return Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(final ObservableEmitter<Object> e) throws Exception {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
e.onNext(new Object()); //instead of Object you can use any data, e.g. derived from View tag
}
});
e.setCancellable(new Cancellable() {
@Override
public void cancel() throws Exception {
button.setOnClickListener(null);
}
});
}
});
}
And apply that operator not forgetting to unsubscribe in onDestroy
(onDestroyView
):
Button addButton;
Disposable addButtonDisposable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
getButtonObservable(addButton)
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
addButtonDisposable = disposable;
}
})
.debounce(1, TimeUnit.SECONDS)
... //make request using flatMap or doOnNext, and subscribe
}
@Override
protected void onDestroy() {
super.onDestroy();
addButtonDisposable.dispose();
}