首页 > 解决方案 > RxAndroid 运算符 retryWhen 被调用但不重新订阅

问题描述

  1. 使用 Retrofit 的 API 类

    类接口 TestApi {
      @GET("/path/abc/xyz")
      有趣的get():单
    }
    
  2. 用例类

    有趣的 getResult(): 单 {
          返回 testApi.get()
            .map{ 响应 ->
                val type = response.type
                何时(类型){
                 空 -> 抛出异常()
                 其他 -> 响应
                }
             }
            .retryWhen{ throwableHandler ->
                throwableHandler.flatMap {
                    当(它){
                       是 Exception() -> Flowable.error(it)
                       否则-> Flowable.timer(3,TimeUnit.SECONDS)
                     }
                }
            }
            .timeout(60, TimeUnit.SECONDS)
        }
        

  3. 主类.kt

    用例.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 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")})

因此调用事件 retryWhen 时,不会再次调用 testPretend() 方法。这里有什么问题?
testPrerend() 的 Single return 和 Retrofit API 有什么区别?

标签: retrofitobservableretrofit2rx-java2rx-android

解决方案


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

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

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


推荐阅读