gpt4 book ai didi

java - RxJava2 使用带有过滤器的 retryWhen

转载 作者:行者123 更新时间:2023-12-02 12:16:40 24 4
gpt4 key购买 nike

我一直在使用 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

但是当我使用 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"));

最佳答案

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

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

关于java - RxJava2 使用带有过滤器的 retryWhen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46117341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com