You can do this quite nicely with the help of the operator switchMap. Each time the button is pressed, it switches to a new subscription for the observed interval - this means that it will start again. The previous subscription is automatically discarded, so multiple intervals will not be performed.
Observable<Long> intervalObservable = Observable.interval(10, TimeUnit.SECONDS);
RxView.clicks(refreshButton)
.switchMap(ignored -> {
return intervalObservable
.startWith(0L)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(x -> performRefresh());
})
.subscribe();
startWith ( ), observeOn , (, ).
: vman , , . , 10 , - , 10 .
Observable<Long> intervalObservable = Observable.interval(10, TimeUnit.SECONDS)
.startWith(0L)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(x -> performRefresh());
Observable<Long> buttonClickedObservable = RxView.clicks(refreshButton)
.map(e -> 0L)
.switchMap(ignored -> Observable.error(new RuntimeException("button pressed")));
Observable.merge(intervalObservable, buttonClickedObservable)
.retry()
.subscribe();
, ( 10 ). , . retry , ( ), .