2

我一直在玩retryWhen()方法,我注意到如果您在retryWhen()中使用filter( )并且如果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

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

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"));
4

1 回答 1

4

您不想filter()在运算符内部使用retryWhen()。相反,请使用if声明或switch声明来确保您完全涵盖所有案例。

工作的方式retryWhen()是它创建一个可观察的并用它调用函数。当它在其onError()方法中捕获 throwable 时,它​​会将 throwable 发射到 observable 中并等待结果。如果它没有得到结果,例如当一个 throwable 被过滤时,它将永远等待。

于 2017-09-08T13:19:12.197 回答