首页 > 解决方案 > 在android中使用rxjava2时使用重试重新连接

问题描述

我有以下 RxJava 一次性用品,我可以在其中收听来自服务器的实时更新

someNetworkBaseFlowable
    .observeOn(schedulerProvider.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .subscribe({
        // handle success
    }, {
        // handle failure
    })

当网络出现故障时,此订阅将失败,即使网络恢复,我也会失去与服务器的连接。

我一直在尝试让我们retryWhen重新订阅服务器,如下所示

someNetworkBaseFlowable
    .observeOn(schedulerProvider.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .retryWhen { error ->
        error.flatMap {
            Flowable.timer(5, TimeUnit.SECONDS)
        }
    }
    .subscribe({
        // handle succes
    }, {
        // handle failure
    })

我虽然这会尝试 ping 或重新连接到服务器并每 5 秒重新订阅一次,但事实并非如此!

我已经挣扎了一段时间,对于这个问题的任何帮助将不胜感激。

标签: rx-java2

解决方案


您可以稍微修改您的代码,如下所示:

  someNetworkBaseFlowable
      .observeOn(schedulerProvider.io())
      .subscribeOn(AndroidSchedulers.mainThread())
      .retryWhen { errorFlowable : Flowable<Throwable> ->

          errorFlowable
          .ofType(YourExceptionType::class.java) // for Kotlin
          // .ofType(YourExceptionType.class) // for Java

          .switchMap{ // to avoid duplicates
              Flowable.timer(5L, TimeUnit.SECONDS)
          }
      }
      .subscribe(
      {
          // handle succes
      }, 
      {
          // handle failure
      })

如果 YourExceptionType 被捕获,它现在会重试吗?


推荐阅读