首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava线性后退,在重试时传入较早的日期参数

RxJava线性后退,在重试时传入较早的日期参数
EN

Stack Overflow用户
提问于 2016-03-11 08:05:51
回答 1查看 218关注 0票数 1

我正在重构一些使用格式化日期参数(例如“2016-3-10”)调用web服务的代码,如果返回null,则会在一天前触发另一个日期方法(比如"2016-3-9")。这将发生在至少3次重试。

我正在将其重构为RxJava,并且不确定如何实现退避策略,或者在这种情况下使用哪个.retry().retryWhen()操作符。

我让web服务使用Retrofit返回通常的Observable

这就是我目前的情况:

代码语言:javascript
复制
 PictureService pictureService = retrofit.create(PictureService.class);

        pictureService.getPhotos(date)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .retry() //Some retry

                ...
                .subscribe()

那么,这里最好使用哪个操作符来重试请求,如果当前日期返回null,我应该如何将新的日期传递给getPhotos()请求?

为了完成这一工作,下面是上面提到的Retrofit服务:

代码语言:javascript
复制
@GET("/someurl/photos?api_key=xxxxxxx")
Observable<PictureAPI> getPhotos(@Query("earth_date") String earthDate);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-11 14:02:31

好了,现在我可以再次回答这个问题了,现在我们开始:

代码语言:javascript
复制
Observable.just("2016-3-10", "2016-3-9", "2016-3-8")
.concatMap(date -> pictureService.getPhotos(date))
.filter(response -> response != null)
.take(1)...

要获得详细的解释,请看一看Dan:http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/的这篇博客文章

简而言之:concat (和concatMap)只有在上一个Observable发出onCompleted之后,并且只有在下游需要更多的项目时,才会订阅每个新的Observabletake(1)将在第一个非null响应之后取消订阅,因此concatMap不会订阅下一个Observable

编辑:检查是否只发送了一个请求

1.)启用重新配置中的日志记录(如果您是最近的版本,可以向Interceptor添加OkHttpClient)。这使您可以直接观察正在发送的请求。

2.)添加如下所示的doOnSubscribe()

代码语言:javascript
复制
.concatMap(date -> pictureService.getPhotos(date)
    .doOnSubscribe(new Action0() {
        @Override
        public void call() {
            Log.d(TAG, "sending request for " + date);   
        }
    });
)

因为重定向请求只在订阅时发送,因此只有当请求被发送时,日志消息才会出现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35935125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档