RxAndroid operator retryWhen 被调用但不重新订阅
RxAndroid operator retryWhen is invoked but does not resubscribe
API class 使用 Retrofit
class interface TestApi {
@GET("/path/abc/xyz")
fun get(): Single
}
用例class
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 return NULL,将调用 retryWhen() 然后再次调用 api。
事件未超时并且 api return 不是 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")})
所以调用事件重试时,不会再次调用testPretend()方法。
这里有什么问题?
Single return by testPrerend() 和 Retrofit API 有什么区别?
方法 testPretend()
没有被再次调用,因为它返回的 observable 是被重新订阅的对象。如果你想在重新订阅时再次调用该方法,你需要做这样的事情:
Single.defer( () => testPretend() )
...
.retryWhen( ... )
...;
这将在重新订阅时调用 testPretend()
。
API class 使用 Retrofit
class interface TestApi { @GET("/path/abc/xyz") fun get(): Single }
用例class
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 return NULL,将调用 retryWhen() 然后再次调用 api。 事件未超时并且 api return 不是 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")})
所以调用事件重试时,不会再次调用testPretend()方法。
这里有什么问题?
Single return by testPrerend() 和 Retrofit API 有什么区别?
方法 testPretend()
没有被再次调用,因为它返回的 observable 是被重新订阅的对象。如果你想在重新订阅时再次调用该方法,你需要做这样的事情:
Single.defer( () => testPretend() )
...
.retryWhen( ... )
...;
这将在重新订阅时调用 testPretend()
。