我一直在玩 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"));
答案 0 :(得分:1)
您不想在filter()
运算符中使用retryWhen()
。相反,请使用if
语句或switch
语句确保您完全覆盖所有案例。
retryWhen()
的工作方式是它创建一个observable并使用它调用该函数。当它在onError()
方法中捕获throwable时,它会将throwable发送到observable并等待结果。如果没有结果,例如过滤掉throwable,它将永远等待。