Как сделать набор параллельных неопределенных запросов с помощью rxJava в Android?

В настоящее время у меня есть служба, которая возвращает список параметров. если есть 4 параметра, мне нужно выполнить один запрос на параметр к той же конечной точке, используя каждый параметр. После этого мне нужно сохранить список результатов всего запроса в коллекцию. Если я не знаю, сколько запросов мне нужно выполнить, Какой оператор rxJava мне нужно использовать и как его использовать?. Учтите, что мне не нужно ждать ответа на первый запрос, чтобы выполнить второй и ....

Я видел, что оператор zip позволяет мне выполнять параллельный запрос, но я должен знать количество запросов, чтобы использовать его.

0
0
409
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать flatMap для создания Observable для каждого parameter и выполнять их параллельно, как в

Observable.fromArray(parameters)
           .flatMap(val -> Observable.just(val)
                  .subscribeOn(Schedulers.io())
                  .map(request -> doApiCall(request))
            )
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(response -> log(response));

ваш вызов .subscribeOn(AndroidSchedulers.mainThread()) не повлияет на изменение потоков, должен ли .observeOn(AndroidSchedulers.mainThread()) изменить Thread в Observer?

Mark Keen 28.03.2018 01:28

Да, спасибо мое плохое

rajan.kali 28.03.2018 05:55
Ответ принят как подходящий

В конце концов я реализовал это так:

public Subscription getElementsByStage(List <String> requiredStages) {
    List < Observable <ElementsResponse>> observables = new ArrayList < > ();
    for (String stage: requiredStages) {
        ElementsRequest request = buildElementRequest(stage);
        observables.add(request).subscribeOn(Schedulers.newThread()));
    }
    Observable zippedObservables = Observable.zip(observables, this::arrangeElementsByStage);
    return zippedObservables
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber <HashMap<Stage,Element>>() {
           .....
        }
  }

Другие вопросы по теме