retrofit - RxAndroid 运算符 retryWhen 被调用但不重新订阅
问题描述
使用 Retrofit 的 API 类
类接口 TestApi { @GET("/path/abc/xyz") 有趣的get():单 }
用例类
有趣的 getResult(): 单 { 返回 testApi.get() .map{ 响应 -> val type = response.type 何时(类型){ 空 -> 抛出异常() 其他 -> 响应 } } .retryWhen{ throwableHandler -> throwableHandler.flatMap { 当(它){ 是 Exception() -> Flowable.error(it) 否则-> Flowable.timer(3,TimeUnit.SECONDS) } } } .timeout(60, TimeUnit.SECONDS) }
主类.kt
用例.getResult() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeBy(onError = {Log.d(TAG,"Error")}, onSuccess = {Log.d(TAG,"Next")})
应用运行时:
如果 api 返回 NULL,将调用 retryWhen() 然后再次调用 api。事件未达到超时且 api 返回 Not NUL 结果 -> onSuccess 被调用。这是 rxJava 中 retryWhen() 运算符的正确处理。
我的问题:
如果我在 MainClass.kt 中编写一些测试方法(假装 API Retrofit),如下所示:
private fun testPretend(): Single<Animal> {
return Single.just(Animal)
}
MainClass.kt 看起来像:
testPretend()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(onError = {Log.d(TAG,"Error")},
onSuccess = {Log.d(TAG,"Next")})
因此调用事件 retryWhen 时,不会再次调用 testPretend() 方法。这里有什么问题?
testPrerend() 的 Single return 和 Retrofit API 有什么区别?
解决方案
该方法testPretend()
不会再次被调用,因为它返回的 observable 是被重新订阅的。如果您希望在重新订阅时再次调用该方法,则需要执行以下操作:
Single.defer( () => testPretend() )
...
.retryWhen( ... )
...;
testPretend()
这将在重新订阅时调用。