gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:22:54 24 4
gpt4 key购买 nike

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

最佳答案

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

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.

编辑:要检查是否真的只发送了一个请求,您可以

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

2.) 像这样添加一个 doOnSubscribe():

.concatMap(date -> pictureService.getPhotos(date)
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.d(TAG, "sending request for " + date);
}
});
)

由于 Retrofit 请求仅在订阅时发送,当且仅当随后发送请求时,日志消息才会出现。

关于android - RxJava 线性退避,在重试时传递较早的日期参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35935125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com