我有下面的无限流,每秒执行一次操作。
我想要的是在出现错误时停止流并对其进行处理。
我该如何实现?
void doSomething() {
Disposable disposable = execute(doSomethingInner(), 0L, TimeUnit.SECONDS, schedulerProvider.io(), someClass -> 1L).doOnError
(throwable -> {
Timber.e(throwable, "error happened");// Never triggered
})
.doOnNext(someClass -> Timber.i("doing the infinite stuff"))
.subscribe(Functions.emptyConsumer(), throwable -> {
Timber.e(throwable, "stop doing the infinite stuff");// Never triggered
});
}
Observable<SomeClass> doSomethingInner() {
return Observable.error(new Exception("something went wrong"));
}
Observable<SomeClass> execute(Observable<SomeClass> source,
long delayInterval,
TimeUnit timeUnit,
Scheduler scheduler,
Function<SomeClass, Long> interval) {
return Observable.defer(new Callable<ObservableSource<SomeClass>>() {
long currentInterval = delayInterval;
@Override
public ObservableSource<SomeClass> call() {
return Single.timer(currentInterval, timeUnit, scheduler)
.flatMapObservable(o -> source)
.doOnNext(t -> currentInterval = interval.apply(t));
}
})
.repeat()
.retry();
}
答案 0 :(得分:2)
我认为retry()
正在消耗您的错误。
尝试之一:
retry()
retry(Predicate<Throwable>)
以决定是否重复。如果您不提前使用流,则订阅者的默认行为是在出错时取消流,并且您应该在onError()
内部收到对subscribe()
的回调。