RxJava использует несколько наблюдаемых (вызовы API) для одного выполнения - PullRequest
0 голосов
/ 31 октября 2018

У меня есть что-то вроде:

private Single<List<Data>> getFirstApiResponse() {
    return Single.just(....)
         /////
         .subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread());
}

private Single<AnotherData> getSecondApiResponse() {
    return Single.just(....)
         /////
         .subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread());
}

public void execute() {
    //Here I need to run both observables one by one, and show result of each in View

   // Code exetuting both
   .subscribe(......);
}

Как я могу запустить две наблюдаемые и подписаться на них в последнем методе. Другими словами, мне нужно запустить метод execute, который будет отображать в пользовательском интерфейсе результат каждой наблюдаемой.

Кстати, Observable не подключен, они извлекают разные данные (поэтому я могу запускать их асинхронно)

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы также можете посмотреть на оператора zip , в зависимости от ваших потребностей. Недостатком этого решения является то, что вы вынуждены объединять свои ответы в пару или другую подходящую структуру данных, которая может не иметь смысла для вас.

public void execute() {
    Single.zip(getFirstApiResponse(), getSecondApiResponse(), 
                (first, second) -> {
                    //now you have both
                    return Pair.of(first, second);
                }).subscribe(pair -> {/**do stuff**/});
    }
0 голосов
/ 31 октября 2018

Один из способов сделать это - flatMap :

public void execute() {
    getFirstApiResponse()
            .flatMap(response1 -> {
                // getFirstApiResponse has completed
                // ...
                return getSecondApiResponse();
            })
            .subscribe(response2 -> {
                // getSecondApiResponse has completed
                // ...
            }, error -> {
                // One of the other operation has failed
            });
}
...