RxAndroid operator retryWhen 被调用但不重新订阅

RxAndroid operator retryWhen is invoked but does not resubscribe

  1. API class 使用 Retrofit

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

  3. MainClass.kt

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