RxJava2使用retryWhen with filter

时间:2017-09-08 13:12:25

标签: java android rx-java2 retrywhen

我一直在玩 retryWhen()方法,我注意到如果你在中使用 filter()重试()如果过滤器()失败,那么即使 onCompleted()也没有执行回调。能告诉我为什么会这样吗?提前谢谢。

工作案例:

    Observable.error(new RuntimeException())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .retryWhen(errors -> errors
                    .filter(throwable -> throwable instanceof RuntimeException)
                    .zipWith(Observable.range(1, 3), (throwable, retryCount) -> {
                        Log.i("lol", "retry " + retryCount);
                        return retryCount;
                    }))
            .subscribe(e -> Log.i("lol", "onNext"), throwable -> Log.i("lol", "onError"), () -> Log.i("lol", "onCompleted"));

工作输出:

I: retry 1
I: retry 2
I: retry 3
I: onCompleted

但是当我用filter(throwable -> throwable instanceof IOException)更改过滤器时,observable就像处于冻结状态。没有回调被解雇。

Observable.error(new RuntimeException())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .retryWhen(errors -> errors
                        .filter(throwable -> throwable instanceof IOException)
                        .zipWith(Observable.range(1, 3), (throwable, retryCount) -> {
                            Log.i("lol", "retry " + retryCount);
                            return retryCount;
                        }))
                .subscribe(e -> Log.i("lol", "onNext"), throwable -> Log.i("lol", "onError"), () -> Log.i("lol", "onCompleted"));

1 个答案:

答案 0 :(得分:1)

您不想在filter()运算符中使用retryWhen()。相反,请使用if语句或switch语句确保您完全覆盖所有案例。

retryWhen()的工作方式是它创建一个observable并使用它调用该函数。当它在onError()方法中捕获throwable时,它会将throwable发送到observable并等待结果。如果没有结果,例如过滤掉throwable,它将永远等待。