RxJava2中loadSingle失败后,如何切换至返回Observable的getObservable?
解决RxJava2中Single失败后切换到Observable的问题
你遇到的核心问题是Single类型的onErrorResumeNext操作符要求返回值必须是Single,但你需要调用返回Observable的方法。这里有两种简洁的解决方案,我会结合你的代码场景详细说明:
方案一:将Single转换为Observable(推荐)
既然后续你需要使用flatMapObservable处理流,不如一开始就把Single转换成Observable,这样整个流的类型统一,onErrorResumeNext就可以直接返回Observable了,完全符合你的需求:
repo.loadSingle() .toObservable() // 关键:把Single转换为Observable,统一流类型 .subscribeOn(Schedulers.io()) .onErrorResumeNext { throwable -> // 这里可以根据异常做额外处理,直接返回目标Observable repo.getObservable(rsList) } .flatMap { data -> if (data != null && data.status == Status.SUCCESS) { upRsList(data.data) } else { repo.getObservable(rsList) } } .subscribe( { /* Observable成功回调:处理发射的数据 */ }, { /* Observable错误回调:处理流中的异常 */ } )
为什么这个方案可行?
toObservable()是RxJava提供的类型转换方法,它会把Single发射的单个数据转换成Observable流,此时后续的所有操作符都是针对Observable的——而Observable的onErrorResumeNext允许返回任意Observable类型的数据源,完美匹配repo.getObservable(rsList)的返回值。
方案二:在Single的onErrorResumeNext中转换Observable为Single
如果你不想改变整个流的初始类型,也可以在onErrorResumeNext里把Observable转换成Single,但需要注意Observable的数据流特性:
repo.loadSingle() .subscribeOn(Schedulers.io()) .onErrorResumeNext { throwable -> // 将Observable转换为Single:取第一个发射的元素,无元素则抛出异常 repo.getObservable(rsList).firstOrError() } .flatMapObservable { data -> if (data != null && data.status == Status.SUCCESS) { upRsList(data.data) } else { repo.getObservable(rsList) } } .subscribe(...)
注意事项:
firstOrError()会把Observable转换成Single,但如果Observable没有发射任何数据,会抛出NoSuchElementException,你需要根据业务场景判断是否接受这种行为,也可以用first(defaultValue)返回带默认值的Single。- 这种方案需要额外做一次类型转换,不如方案一顺畅,更适合不需要后续Observable操作的场景。
原代码的问题根源
你原来的代码中,repo.loadSingle()返回的是Single,对应的onErrorResumeNext是Single类的操作符,它的函数参数必须返回Single类型,但repo.getObservable(rsList)返回的是Observable,类型不匹配导致编译失败——上面的两种方案都是通过类型转换解决了这个匹配问题。
内容的提问来源于stack exchange,提问作者iamanbansal
相关产品推荐
相关产品推荐

