Retrofit + RxJava - 缓存/发布并在出错时重试?

时间:2017-10-23 12:28:38

标签: android rx-java retrofit2

我有以下要求:

  1. 多个观察者(片段)需要订阅数据源。
  2. 活动将启动网络请求。请求成功后,每个观察者都将收到结果。
  3. 我尝试使用缓存/发布运算符来完成它,但问题是初始请求何时返回错误。此时,我希望重置流,并且对该方法的后续调用应该运行新的网络请求,而不是每次都返回错误。

    这是我目前所拥有的。

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

    这样可行,但代码感觉不对。必须有更好的方法。

2 个答案:

答案 0 :(得分:0)

您可以提前定义可观察对象,并且在订阅它之前它实际上不会做任何事情。这需要担心的null值少一点。

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

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

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

答案 1 :(得分:0)

显然没有那个运算符。

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