【问题标题】:RxAndroid operator retryWhen is invoked but does not resubscribeRxAndroid 运算符 retryWhen 被调用但不重新订阅
【发布时间】:2019-05-01 03:53:15
【问题描述】:
  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. MainClass.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 有什么区别?

【问题讨论】:

  • fun get() : Single
  • fun getResult(): Single
  • 抱歉我无法格式化描述@@

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。是的 !如果我使用 fromCallable 而不是 just ,它会起作用。那么可以使用 Single 的 just、create 或 fromCallable 运算符来解释更多吗?为什么只是运算符不能用于这种情况?
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多