Rx java, как заблокировать, пока не закончится? - PullRequest
0 голосов
/ 10 марта 2020

Итак, у меня есть 3 службы отдыха для вызова, проблема в том, что мне нужны услуги от 1 до конца sh до вызова службы 2, и мне нужна услуга от 2 до конца sh до вызова службы 3.

Потому что каждый раз, когда мне нужно передать данные из предыдущего сервиса в следующий.

сейчас я создаю цепочку своих задач, но мне это не нравится, потому что именование методов становится довольно массовым

Пример service 1;

compositeDisposable.add(simpleRetrofitService.getInventaireDisponibleResultatDtos()
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .subscribe(this::callService2Then3ThenSaveThenGoToNextScreen,
                           this::logErrorAndDisplayPopup));

callServiceOneThenTwoThenSaveThenGoToNextScreen()

, а затем задайте другую асинхронную задачу, которая вызывает callService3ThenSaveThenFoToNextScreen()

Есть идеи?

Спасибо.

Редактировать: точность

Call1 () вернет объект, содержащий список целых чисел, например [1, 2, 8, 132] Затем я должен вызвать call2 () для каждого целого числа. То же самое для call3 (), call2 () дает мне некоторые значения, и я должен вызывать Call3 () для каждого значения.

1 Ответ

1 голос
/ 10 марта 2020

Для простоты я предполагаю, что ваши звонки simpleRetrofitService.call1(). simpleRetrofitService.call2() и simpleRetrofitService.call3(). Я также предполагаю, что они возвращают http://reactivex.io/RxJava/javadoc/io/reactivex/Single.html

Затем вы можете сделать некоторые базовые c вещи вроде этого (используя http://reactivex.io/documentation/operators/flatmap.html):

simpleRetrofitService.call1()
  .flatMap(r1 -> simpleRetrofitService.call2(r1))
  .flatMap(r2 -> simpleRetrofitService.call3(r2))
  .subscribeOn(...)
  .observeOn(...)
  .subscribe(...)

На самом деле AsyncTask вообще не нужен.


Обновление в ответ на обновление вопроса:

Предполагая, что ваш вызов возвращает список, вы можете сделать что-то вроде это (используя http://reactivex.io/RxJava/javadoc/io/reactivex/Single.html#flattenAsObservable (io.reactivex.functions.Function) ):

simpleRetorfitService.call1()
  .flattenAsObservable(...)
  .flatMap(listItem -> simpleRetrofitService.call2(listItem)
  ...
...