我正在重构一些使用格式化日期参数(例如“2016-3-10”)调用web服务的代码,如果返回null,则会在一天前触发另一个日期方法(比如"2016-3-9")。这将发生在至少3次重试。
我正在将其重构为RxJava,并且不确定如何实现退避策略,或者在这种情况下使用哪个.retry()或.retryWhen()操作符。
我让web服务使用Retrofit返回通常的Observable。
这就是我目前的情况:
PictureService pictureService = retrofit.create(PictureService.class);
pictureService.getPhotos(date)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry() //Some retry
...
.subscribe()那么,这里最好使用哪个操作符来重试请求,如果当前日期返回null,我应该如何将新的日期传递给getPhotos()请求?
为了完成这一工作,下面是上面提到的Retrofit服务:
@GET("/someurl/photos?api_key=xxxxxxx")
Observable<PictureAPI> getPhotos(@Query("earth_date") String earthDate);发布于 2016-03-11 14:02:31
好了,现在我可以再次回答这个问题了,现在我们开始:
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之后,并且只有在下游需要更多的项目时,才会订阅每个新的Observable。take(1)将在第一个非null响应之后取消订阅,因此concatMap不会订阅下一个Observable。
编辑:检查是否只发送了一个请求
1.)启用重新配置中的日志记录(如果您是最近的版本,可以向Interceptor添加OkHttpClient)。这使您可以直接观察正在发送的请求。
2.)添加如下所示的doOnSubscribe():
.concatMap(date -> pictureService.getPhotos(date)
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.d(TAG, "sending request for " + date);
}
});
)因为重定向请求只在订阅时发送,因此只有当请求被发送时,日志消息才会出现。
https://stackoverflow.com/questions/35935125
复制相似问题