Задержка нескольких звонков в Retrofit - PullRequest
0 голосов
/ 13 января 2019

Я занимаюсь разработкой приложения для Android с использованием модификаций и rxjava. В основном у меня есть веб-сервис (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 голосов
/ 14 января 2019

Функция задержки добавляет данную задержку к каждому излучаемому значению. Таким образом, ваша текущая реализация выполнит все запросы как можно быстрее, и каждый отправленный ответ будет задержан на 500 мс. Это не то, чего вы хотите достичь.

Попробуйте добавить задержку после строки Observable.range(1, ...), используя эту строку кода .concatMap(i-> Observable.just(i).delay(500, TimeUnit.MILLISECONDS)), и удалите все остальные задержки.

Если вы хотите прочитать дополнительную информацию об операторе concat: http://reactivex.io/documentation/operators/concat.html

...