首页 文章

RxAndroid运算符重试何时被调用但不重新订阅

提问于
浏览
1
  • 使用Retrofit的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返回非NUL结果 - > onSuccess被调用 . 这是正确处理rxJava中的retryWhen()运算符 .

My Problem:
如果我在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()方法 . 这里有什么问题?
而testPrerend()和Retrofit API的单一返回有什么区别?

1 回答

  • 1

    方法 testPretend() 不会再次调用,因为它返回的observable是重新订阅的内容 . 如果您希望在重新订阅时再次调用该方法,则需要执行以下操作:

    Single.defer( () => testPretend() )
      ...
      .retryWhen( ... )
      ...;
    

    这将在重新订阅时调用 testPretend() .

相关问题