我正在学习如何在RxJava2中进行数据轮询
到目前为止,这是我的代码。
private io.reactivex.Single<String> getMyTask() {
return io.reactivex.Single.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
Log.d("ERSEN","Task Started!");
Random random = new Random(System.currentTimeMillis());
if(random.nextBoolean()){
return "WORK COMPLETED";
}
Log.d("ERSEN","Task Had An Error!");
throw new IllegalArgumentException();
}
});
}
上面是我的Single
,它发出String
基本上模拟了一些工作。
当轮询事件无法检查重新订阅是否正确发生时,我还使任务随机成功并且无法测试案例
我的问题
compositeDisposable.add(getMyTask()
.repeatWhen(new Function<Flowable<Object>, Publisher<?>>() {
@Override
public Publisher<?> apply(final Flowable<Object> objectFlowable) throws Exception {
return objectFlowable.delay(INTERVAL, TimeUnit.SECONDS);
}
})
.retryWhen(throwableFlowable -> throwableFlowable.flatMap(new Function<Throwable, Publisher<?>>() {
@Override
public Publisher<?> apply(Throwable throwable) throws Exception {
if (throwable instanceof ClassCastException) {
return Flowable.error(throwable);
}
return throwableFlowable.delay(INTERVAL, TimeUnit.SECONDS);
}
}))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onSuccess, this::onError));
在上面,当我成功发出一些数据时,我正在重新订阅Observable
。
我遇到retryWhen
。
对于此示例,我希望在ClassCastException
发生时不重试。
在我的Observable
中,由于我正在测试仅在某些错误上重试的逻辑,因此无法生成这个原因
但是,当Observable
出现错误时,我正在使用上面的代码恢复此错误
This processor allows only a single Subscriber
我不确定有什么问题,我一直关注这篇博文
http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/
感谢阅读 如果您希望我发布更多详细信息,请与我们联系
答案 0 :(得分:1)
您正在重新订阅retryWhen
中的错误流,这是不允许的,在您的情况下没有意义。您应该在flatMap
中延迟一个值:
.retryWhen(throwableFlowable -> throwableFlowable.flatMap(
new Function<Throwable, Publisher<?>>() {
@Override
public Publisher<?> apply(Throwable throwable) throws Exception {
if (throwable instanceof ClassCastException) {
return Flowable.error(throwable);
}
return Flowable.just("ignored").delay(INTERVAL, TimeUnit.SECONDS);
}
}
))