延迟翻新中的多个呼叫

时间:2019-01-13 18:56:19

标签: android retrofit rx-java

我正在使用翻新和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());
        }
    });
}

1 个答案:

答案 0 :(得分:0)

延迟功能将给定的延迟添加到每个发射值。 因此,您当前的实现将尽快触发所有请求,并且每个发出的响应都会延迟500毫秒。这不是您想要实现的。

尝试使用此行代码Observable.range(1, ...).concatMap(i-> Observable.just(i).delay(500, TimeUnit.MILLISECONDS))行之后添加延迟,并删除所有其他延迟。

如果您想阅读有关concat运算符的更多信息: http://reactivex.io/documentation/operators/concat.html