在 RxJava 中,错误重试一般通过 retry / retryWhen 操作符来实现。下面从简单到进阶给你讲清楚。
Observable.create(emitter -> {
throw new RuntimeException("error");
})
.retry(3) // 最多重试 3 次
.subscribe(
data -> Log.d("TAG", "onNext"),
e -> Log.e("TAG", "最终失败")
);
⚠️ 问题:
.retry((times, throwable) -> {
if (throwable instanceof IOException && times <= 3) {
return true;
}
return false;
})
✅ 适合:网络错误才重试
retryWhenobservable
.retryWhen(errors -> errors
.zipWith(Observable.range(1, 3), (e, retryCount) -> retryCount)
.flatMap(retryCount ->
Observable.timer(2, TimeUnit.SECONDS)
)
)
含义:
.retryWhen(errors -> errors
.flatMap(error -> {
if (error instanceof IOException) {
return Observable.timer(1, TimeUnit.SECONDS);
}
return Observable.error(error);
})
)
.retryWhen(errors ->
errors.flatMap((error, attempt) ->
attempt < 3
? Observable.timer((long) Math.pow(2, attempt), TimeUnit.SECONDS)
: Observable.error(error)
)
)
重试时间:
api.getData()
.retryWhen(errors -> errors
.flatMap(error ->
Observable.timer(2, TimeUnit.SECONDS)
)
)
.subscribe(...)
| 版本 | 方法 |
|---|---|
| RxJava 1 | retryWhen(Func1) |
| RxJava 2/3 | retryWhen(Function) |
现在基本都用 RxJava 2 / 3
retryWhen 里必须 返回 ObservableonError✔ 网络请求:
retryWhen + timer + 指数退避
✔ 只重试指定异常
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。