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

时间:2016-03-11 08:05:51

标签: android retrofit rx-java rx-android retrofit2

我正在重构一些代码,这些代码会调用带有格式化日期参数的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);

1 个答案:

答案 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请求仅在订阅时发送,因此当且仅当发送请求时才会显示日志消息。