Лучший способ сделать вызов Rx Java на основе результатов предыдущего вызова API - PullRequest
0 голосов
/ 13 января 2020

Я выполняю вызов API, чтобы получить описания подкаста программы, и в зависимости от типа подкаста мне может потребоваться или не потребоваться выполнить другой вызов API для получения дополнительной информации. Я новичок в Rx Java и не уверен, что это лучший способ совершать такие звонки. Вот что у меня есть:

public void fetchFeaturedItems() {
    Timber.i("Fetching Featured...");
    disposables.add(episodeService.getFeatured()
        .subscribeOn(Schedulers.io())
        .doOnNext(featured -> { //make second call
            final Episode episode = featured.getEpisode();
            Observable<Timing> timingObservable = episodeService.getTimingForEpisodeActs(episode);
            if (timingObservable != null) {
                timingObservable
                    .subscribeOn(Schedulers.io())
                    .doOnError(Timber::e)
                    .subscribe(timing -> {episodeManager.saveTiming(timing);}); //save to database

            }

        })
        .observeOn(Schedulers.io())
        .subscribe(featured -> {
            saveFeatured(featured);
            final Episode episode = featured.getEpisode();
            notificationManager.handleNewEpisodeNotification(episode);
        }, Timber::e));
}

Это все работает, но я получаю предупреждение lint «результат подписки не используется» при второй подписке. Я не объединяю результаты двух звонков. Я мог бы действительно использовать некоторые указания.

Ответы [ 2 ]

0 голосов
/ 17 января 2020

.doOnNext является оператором побочных эффектов. Что вы делаете:

           timingObservable
                .subscribeOn(Schedulers.io())
                .doOnError(Timber::e)
                .subscribe(timing -> {episodeManager.saveTiming(timing);});

Буду просто создавать одноразовые. Этот одноразовый не будет частью потока. Также обратите внимание, что поток timingObservable теперь будет работать совершенно независимо, потому что, как я только что сказал, doOnNext является оператором побочного эффекта. То, что вы делаете, - это звонок «забей и забудь». Чтобы сделать ответ как часть потока, используйте. flatMap вместо. doOnNext. Он объединит ваши ответы по мере их поступления и направит их * последующим операторам.

В идеале, реактивный поток должен быть подписан только один раз - вы делаете это дважды. Это немедленный кодовый запах.

0 голосов
/ 13 января 2020

Используйте flatMap () вместо onNext (). Вы получаете предупреждение о том, что «результат подписки не используется» является причиной повторной подписки. flatMap () должен помочь.

сначала прочтите это и другую документацию Rx Java

...