我正在使用翻新和rxjava在Android中开发应用程序。基本上,我有一个Web服务(themoviedb),可以通过它连接下载/同步数据。我遇到的问题通常是,当我尝试下载过多的剧集数据时,我收到错误429太多的请求。每个请求应延迟500毫秒。
我的代码是:
public void downloadSeason(int seasonNumber)
{
Log.d(TAG,"adding a season"+seasonNumber);
int delay = 500;
Observable<SeriesSeasonResponse> seasonSpecs = mSeasonService.getSeasonSpecs(seriesEntity.getId(), seasonNumber,
Consts.DEFAULT_LANGUAGE, Consts.API_KEY_V3);
seasonSpecs.subscribeOn(Schedulers.io()).observeOn(Schedulers.computation())
.delay(delay, TimeUnit.MILLISECONDS)
.subscribe(new Observer<SeriesSeasonResponse>()
{
@Override
public void onComplete()
{
}
@Override
public void onSubscribe(Disposable d)
{
}
@Override
public void onNext(SeriesSeasonResponse seriesSeasonResponse)
{
addSeasonToDataBase(seriesEntity.getName(), seriesSeasonResponse);
Observable.range(1, seriesSeasonResponse.getEpisodes().size())
.subscribe(new Observer<Integer>()
{
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.d(TAG,"adding season"+seriesSeasonResponse.getSeasonNumber()+" episode"+integer);
EpisodeInSeason currentEpisode = seriesSeasonResponse.getEpisodes().get(integer);
Observable<EpisodeSpecsResponse> episodeSpecs = mEpisodeSpecsService.getEpisodeSpecs(seriesEntity.getId(), currentEpisode.getSeasonNumber(), currentEpisode.getEpisodeNumber(), Consts.DEFAULT_LANGUAGE, Consts.API_KEY_V3);
episodeSpecs
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.delay(500, TimeUnit.MILLISECONDS)
.subscribe(new Observer<EpisodeSpecsResponse>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(EpisodeSpecsResponse episodeSpecsResponse) {
addEpisodeToDataBase(seriesEntity.getId(),episodeSpecsResponse);
Log.d(TAG,String.format("added "+"S%02dE%02d",episodeSpecsResponse.getSeasonNumber(),episodeSpecsResponse.getEpisodeNumber()));
}
@Override
public void onError(Throwable e) {
Log.d(TAG, e.getMessage());
}
@Override
public void onComplete() {
}
});
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "Episode error= "+e.getMessage());
}
@Override
public void onComplete() {
}
});
}
@Override
public void onError(Throwable e)
{
Log.e(TAG, "Season error= "+e.getMessage());
}
});
}
答案 0 :(得分:0)
延迟功能将给定的延迟添加到每个发射值。 因此,您当前的实现将尽快触发所有请求,并且每个发出的响应都会延迟500毫秒。这不是您想要实现的。
尝试使用此行代码Observable.range(1, ...)
在.concatMap(i-> Observable.just(i).delay(500, TimeUnit.MILLISECONDS))
行之后添加延迟,并删除所有其他延迟。
如果您想阅读有关concat运算符的更多信息: http://reactivex.io/documentation/operators/concat.html