使用带延迟的RetryWhen()时出现类型错误
问题原因与解决方法
嘿,这个问题我太熟了——本质是RxJava版本差异导致的类型不兼容!你参考的教程是基于RxJava 1.x写的,但你现在用的应该是RxJava 2.x或更高版本,这两个版本在流类型的设计上有很大区别:
在RxJava 2+中:
retryWhen接收的错误流errors是Flowable<Throwable>类型- 它的
flatMap方法要求返回的是**Publisher接口的实现类**(比如Flowable) - 但你写的
Observable.timer(30, TimeUnit.SECONDS)返回的是Observable,它并不实现Publisher接口,所以编译器直接报错类型不匹配。
两种解决方法任你选:
方法一:统一使用Flowable的timer方法
直接把Observable换成Flowable,完全贴合当前流的类型要求:
.retryWhen(errors -> errors.flatMap(error -> Flowable.timer(30, TimeUnit.SECONDS)))
方法二:将Observable转换为Flowable(如果非要用Observable的话)
如果你有特殊需求必须用Observable,可以通过toFlowable()方法把它转换成Flowable,同时指定背压策略(根据你的业务场景选择,比如LATEST、BUFFER等):
.retryWhen(errors -> errors.flatMap(error -> Observable.timer(30, TimeUnit.SECONDS) .toFlowable(BackpressureStrategy.LATEST) ))
简单总结:RxJava 2+把Observable和Flowable做了明确拆分,Flowable支持背压,而retryWhen的错误流是带背压的Flowable,所以必须返回兼容的流类型才行~
内容的提问来源于stack exchange,提问作者Michel Feinstein
相关产品推荐
相关产品推荐

