RxAndroid运算符retryWhen被调用但不重新订阅

时间:2018-11-29 06:26:02

标签: retrofit observable retrofit2 rx-java2 rx-android

  1. 使用翻新的API类

    class interface TestApi {
      @GET("/path/abc/xyz") 
      fun get(): Single
    }
    
  2. 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)
        }
        

  3. MainClass.kt

    usecase.getResult()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(onError = {Log.d(TAG,"Error")},
                         onSuccess = {Log.d(TAG,"Next")})
    
  4. 应用运行时:
    如果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有什么区别?

1 个答案:

答案 0 :(得分:1)

方法testPretend()不再被调用,因为它返回的可观察到的是正在重新订阅的内容。如果希望在重新订阅时再次调用该方法,则需要执行以下操作:

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

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