前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava 错误处理操作符

RxJava 错误处理操作符

作者头像
三流编程
发布2018-09-11 15:51:43
1.1K0
发布2018-09-11 15:51:43
举报

在源 Observable 遇到错误时,立即停止源 Observable 的数据发送,并用新的 Observable 对象进行新的数据发送。

val ob = Observable.create(ObservableOnSubscribe<Int> { emitter ->
    (0..3).forEach {
        if (it == 2) emitter.onError(Throwable())
        else emitter.onNext(it)
    }
})

ob.onErrorResumeNext(Function<Throwable, ObservableSource<out Int>> { Observable.just(100) })
        .subscribe(observerInt)

发射了 0,1 后,会发射 onError,此时使用新的 Observable 发射 100,所以最终发射情况是:

onNext(0)
onNext(1)
onNext(100)
onComplete()

重载方法,参数直接传发生错误时用的 Observable

ob.onErrorResumeNext(Observable.just(200,201)).subscribe(observerInt)
onNext(0)
onNext(1)
onNext(200)
onNext(201)
onComplete()

onErrorReturn/onErrorReturnItem

发生 onError 时返回一个特定的值,然后 onComplete。

ob.onErrorReturn { 8 }.subscribe(observerInt)

ob.onErrorReturnItem(8).subscribe(observerInt)
onNext(0)
onNext(1)
onNext(8)
onComplete()

onExceptionResumeNext

和 onErrorResumeNext 类似,区别在于如果 onError 传的参数不是 Exception,那么会收到 onError。

只有一个构造方法,参数是 Observable。

ob.onExceptionResumeNext(Observable.just(-1)).subscribe(observerInt)
onNext(0)
onNext(1)
onError()

修改发射 onError 时的参数。

val ob = Observable.create(ObservableOnSubscribe<Int> { emitter ->
   (0..3).forEach {
       if (it == 2) emitter.onError(Exception())
       else emitter.onNext(it)
   }
})

则同样的代码收到的是

onNext(0)
onNext(1)
onNext(-1)
onComplete()

retry/retryUntil/retryWhen

发生 onError 时会重试。

// 无限重试,其实最多是 Long.MAX_VALUE 次
public final Observable<T> retry()
// 指定重试次数
public final Observable<T> retry(long times)
// 参数回调返回 true 时重试
public final Observable<T> retry(Predicate<? super Throwable> predicate)
// 两个控制条件都满足时重试
public final Observable<T> retry(long times, Predicate<? super Throwable> predicate)
// 参数第一个泛型是重试次数,第二个是错误信息,返回 true 时重试
public final Observable<T> retry(BiPredicate<? super Integer, ? super Throwable> predicate)
// onNext(0)
// onNext(1)
// onNext(0)
// onNext(1)
// onNext(0)
// onNext(1)
// onError()
ob.retry(2).subscribe(observerInt)

// 一直 true,一直重试
ob.retry(Predicate { true }).subscribe{Log.e("RX", "$it")}

// 和 retry(2) 一样效果
ob.retry(2, { true }).subscribe(observerInt)
ob.retry{ t1, _ -> t1 < 3 }.subscribe(observerInt)
var i = 0
ob.retryUntil {
    i++ > 1 // i > 1 时已经重试两次了,返回 true 以停止重试
}.subscribe(observerInt)

ob.retryWhen { 
  // 返回的 Observable 还活着就重试
  Observable.interval(0, 100, TimeUnit.MILLISECONDS).take(2)
}.subscribe{Log.e("RX", "$it")}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.06.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • onErrorReturn/onErrorReturnItem
  • onExceptionResumeNext
  • retry/retryUntil/retryWhen
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档