使用翻新的API类
class interface TestApi { @GET("/path/abc/xyz") fun get(): Single }
UseCase类
fun getResult(): Single { return testApi.get() .map{ response -> val type = response.type when(type){ null -> throw Exception() else -> response } } .retryWhen{ throwableHandler -> throwableHandler.flatMap { when(it) { is Exception() -> Flowable.error(it) else -> Flowable.timer(3,TimeUnit.SECONDS) } } } .timeout(60, TimeUnit.SECONDS) }
MainClass.kt
usecase.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改造),则如下所示:
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有什么区别?
答案 0 :(得分:1)
方法testPretend()
不再被调用,因为它返回的可观察到的是正在重新订阅的内容。如果希望在重新订阅时再次调用该方法,则需要执行以下操作:
Single.defer( () => testPretend() )
...
.retryWhen( ... )
...;
这将在重新订阅后调用testPretend()
。