【问题标题】:Retrofit + RxJava - cache / publish and retry on error?Retrofit + RxJava - 缓存/发布并重试错误?
【发布时间】:2017-10-23 12:28:37
【问题描述】:

我有以下要求:

  1. 多个观察者(片段)需要订阅一个数据源。
  2. Activity 将启动网络请求。一旦请求成功,每个观察者都会收到结果。

我尝试使用缓存/发布操作符来实现,但问题是初始请求何时返回错误。此时我希望重置流,并且对该方法的后续调用应该运行一个新的网络请求,而不是每次都返回错误。

这是我目前拥有的。

private Flowable<List<Data>> dataObservable;

private Flowable<List<Data>> getData(){
    if(dataObservable == null){
        dataObservable = apiService.getData()
                .doOnError(throwable -> {
                    dataObservable = null;
                })
                .cache();
    }
    return dataObservable;
}

这可行,但代码感觉不对。一定有更好的方法。

【问题讨论】:

    标签: android rx-java retrofit2


    【解决方案1】:

    你可以提前定义 observable,它实际上不会做任何事情,直到有东西订阅它。不用担心null 的价值。

    您可以使用retry() 运算符或其变体,在出现错误时自动重试网络操作。

    最后,cache() 运营商将确保只有一个网络连接订阅处于活动状态。每个订阅者都会从 observable 获得任何更新,并且不会注意到遇到的任何网络错误。

    Flowable<List<Data>> dataObservable = apiService.getData()
      .retry()
      .cache();
    

    【讨论】:

    • 问题是 retry() 运算符无限期地重试,没有我的任何输入。
    • 有几个retry() 运算符接受各种参数。这是一个很好的介绍:blog.danlew.net/2016/01/25/…
    【解决方案2】:

    显然没有运算符。

    该问题已在Observable, retry on error and cache only if completed 讨论过 Plato 为此创建了一个不错的小库 platoblm/rx-onerror-retry-cache.

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多