温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava如何做错误重试

发布时间:2026-09-20 16:27:23 来源:亿速云 阅读:83 作者:小樊 栏目:编程语言

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;
})

✅ 适合:网络错误才重试


三、带延迟的重试(最常用 ✅)

1️⃣ 使用 retryWhen

observable
.retryWhen(errors -> errors
    .zipWith(Observable.range(1, 3), (e, retryCount) -> retryCount)
    .flatMap(retryCount ->
        Observable.timer(2, TimeUnit.SECONDS)
    )
)

含义:

  • 最多重试 3 次
  • 每次间隔 2 秒

四、指数退避重试(推荐 ✅✅)

.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)
    )
)

重试时间:

  • 第 1 次:2s
  • 第 2 次:4s
  • 第 3 次:8s

五、结合 Retrofit(网络请求重试)

api.getData()
.retryWhen(errors -> errors
    .flatMap(error ->
        Observable.timer(2, TimeUnit.SECONDS)
    )
)
.subscribe(...)

六、RxJava 2 / 3 差异

版本 方法
RxJava 1 retryWhen(Func1)
RxJava 2/3 retryWhen(Function)

现在基本都用 RxJava 2 / 3


七、常见坑 ⚠️

  1. retry 会重新执行整个 Observable
  2. retryWhen 里必须 返回 Observable
  3. 不处理异常会直接走 onError

八、推荐方案 ✅

✔ 网络请求:
retryWhen + timer + 指数退避

✔ 只重试指定异常


如果你愿意,我可以:

  • 给你 Kotlin + RxJava 示例
  • 给你 Retrofit 封装重试工具类
  • 或对比 Coroutine retry 实现方式
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI