Цепочка два ответа Single - PullRequest
0 голосов
/ 20 декабря 2018

Мне нужно связать два ответа RX Single - Retrofit, чтобы получить ArrayList с двумя ответами, которые возвращают список

Я пытался обработать оба ответа с Map, Flatmap, но я недостиг того, что я ожидал

final ArrayList <List<Consent>> listAllConsents = new ArrayList<>();
Single<List<Consent>> responseDspConsent = subscriptionCenterRemoteDataSource.getConsents(Globals.getAuthorizationTokenUser());
Single<List<Consent>> responseDspConsentByApp = subscriptionCenterRemoteDataSource.getConsentsByApp(Globals.getAuthorizationTokenUser());

responseDspConsentByApp.subscribeOn(Schedulers.newThread())
                           .observeOn(AndroidSchedulers.mainThread());

    responseDspConsent.subscribeOn(Schedulers.newThread())
                      .observeOn(AndroidSchedulers.mainThread())

                      .flatMap(consentData -> {
                          List<Consent> consentList = consentData;
                          listAllConsents.add(consentList);

                          return responseDspConsentByApp.map(consentDataByApp -> {
                              List<Consent> consentListByApp = consentDataByApp;
                              listAllConsents.add(consentListByApp);

                              return listAllConsents;
                          });
                      })
                      .subscribe(consentData -> {
                            Log.v("Entramoss", "Valor: " + listAllConsents.get(0).get(0).getTitle());

                            paintAllConsents(listAllConsents);
                      });

Мне нужно, чтобы все объекты двух ответов были в arrayList, чтобы я мог нарисовать их позже.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

если ваш заказ измеряет счетчик, я предлагаю вам сделать .concat как ответ @ebasha, но если ваш заказ не измеряет счетчик, я предлагаю вам использовать .merge, потому что он намного быстрее, чем .concat, потому что concat подписывается на потоки один за другим инемедленно объединить потоки подписки

Single<List<Consent>> responseDspConsent = subscriptionCenterRemoteDataSource
                   .getConsents(Globals.getAuthorizationTokenUser())
                   .subscribeOn(Schedulers.newThread())
                   .observeOn(AndroidSchedulers.mainThread());

Single<List<Consent>> responseDspConsentByApp = subscriptionCenterRemoteDataSource
                   .getConsentsByApp(Globals.getAuthorizationTokenUser())
                   .subscribeOn(Schedulers.newThread())
                   .observeOn(AndroidSchedulers.mainThread());

Observable.merge(responseDspConsent.toObservable(),responseDspConsentByApp.toObservable())
                   .toList()
                   .doOnSuccess((list) -> {
                       paintAllConsents(list); 
                   })
                   .subscribe();
0 голосов
/ 21 декабря 2018

У вас есть 2 способа сделать это.

1.Вы можете использовать Observable.concat (Obs 1, Obs 2).Оператор concat объединяет наблюдаемые и возвращает одну наблюдаемую, которая сначала испускает элементы из первой наблюдаемой, а затем из второй.Источник: http://reactivex.io/documentation/operators/concat.html

Single<List<Consent>> responseDspConsent = subscriptionCenterRemoteDataSource
                       .getConsents(Globals.getAuthorizationTokenUser())
                       .subscribeOn(Schedulers.newThread())
                       .observeOn(AndroidSchedulers.mainThread());

Single<List<Consent>> responseDspConsentByApp = subscriptionCenterRemoteDataSource
                       .getConsentsByApp(Globals.getAuthorizationTokenUser())
                       .subscribeOn(Schedulers.newThread())
                       .observeOn(AndroidSchedulers.mainThread());

Observable.concat(responseDspConsent.toObservable(),responseDspConsentByApp.toObservable())
                       .toList()
                       .doOnSuccess((list) -> {
                           paintAllConsents(list); 
                       })
                       .subscribe();

2.Вы можете использовать оператор .concatWith, который делает то же самое, что и оператор concat, но теперь он объединяет наблюдаемое с другим без создания новой наблюдаемой.

Single<List<Consent>> responseDspConsent = subscriptionCenterRemoteDataSource
                       .getConsents(Globals.getAuthorizationTokenUser())
                       .subscribeOn(Schedulers.newThread())
                       .observeOn(AndroidSchedulers.mainThread());

Single<List<Consent>> responseDspConsentByApp = subscriptionCenterRemoteDataSource
                       .getConsentsByApp(Globals.getAuthorizationTokenUser())
                       .subscribeOn(Schedulers.newThread())
                       .observeOn(AndroidSchedulers.mainThread());

responseDspConsent.concatWith(responseDspConsentByApp)
                       .toList()
                       .doOnSuccess((list) -> {
                           paintAllConsents(list); 
                       })
                       .subscribe();
...