【问题标题】:Delay multiple calls in Retrofit在 Retrofit 中延迟多个调用
【发布时间】:2019-01-14 07:08:40
【问题描述】:

我正在使用 Retrofit 和 rxjava 在 Android 中开发一个应用程序。基本上我有一个网络服务(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());
        }
    });
}

【问题讨论】:

    标签: android retrofit rx-java


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2016-03-22
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多