RxJava RetryWhen,此处理器仅允许单个订阅服务器

时间:2018-03-24 14:02:11

标签: android rx-java2

我正在学习如何在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/

感谢阅读 如果您希望我发布更多详细信息,请与我们联系

1 个答案:

答案 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);
            }
        }
    ))