我正在重构一些代码,这些代码会调用带有格式化日期参数的Web服务(例如,#34; 2016-3-10")如果返回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);
答案 0 :(得分:3)
好的,既然我可以再次回答这个问题,我们就去了:
Observable.just("2016-3-10", "2016-3-9", "2016-3-8")
.concatMap(date -> pictureService.getPhotos(date))
.filter(response -> response != null)
.take(1)...
有关详细说明,请查看Dan Lew撰写的这篇博客文章:http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
简而言之:concat
(和concatMap
)只有在前一个Observable
发出onCompleted
之后才会订阅每个新take(1)
并且只有在下游需要更多项目时才会订阅。 null
在第一次非concatMap
回复后会取消订阅,因此Observable
将不会订阅下一个Interceptor
。
编辑:要检查确实只发送了一个请求,您可以
1。)启用登录Retrofit(如果您是最新版本,则向OkHttpClient
添加doOnSubscribe()
)。这使您可以直接观察正在发送的请求。
2。)像这样添加.concatMap(date -> pictureService.getPhotos(date)
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.d(TAG, "sending request for " + date);
}
});
)
:
NSFetchedResultsController
由于Retrofit请求仅在订阅时发送,因此当且仅当发送请求时才会显示日志消息。