Android + Rx Java + Для L oop + Не все запросы выполняются - PullRequest
5 голосов
/ 03 августа 2020

Вызывающая сторона метода,

 for (String name : controllerToPartitionModels.keySet())
    {
        List<PartitionModel> partitionsList = controllerToPartitionModels.get(name);
        refreshPartition(partitionsList,false);
    }

Метод

 private void refreshPartition(List<PartitionModel> partitionModels, boolean isSyncAll) {
    ITModule.getITService()
            .refreshPartitionStatus(new ArrayList<>(partitionModels), isSyncAll)
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(new Action() {
                @Override
                public void run() throws Exception {
                    Logger.get().d(ATTActionManager.this, "Refreshing request sent successfully for list of size : " + partitionModels.size());
                }
            }, (@NonNull Throwable throwable) -> {
                Logger.get().d(ATTActionManager.this, "Error on Refresh request");
            });
}

Проблема Если нужно отправить 2 запроса, я иногда вижу, что отправляется только один запрос. Это означает, что даже если l oop выполняется дважды для 2 запросов (HTTP), я вижу, что на сервер отправляется только один запрос. Что я здесь делаю не так? Rx java используемая версия: 2.2.19

1 Ответ

1 голос
/ 15 августа 2020

Вы можете объединить два вышеуказанных метода для решения вашей проблемы, используя flatMapIterable.

Объединенное решение:

private void refreshPartition(Map<String, ?> controllerToPartitionModels) {

    Observable.just(controllerToPartitionModels)
            .map(controllerToPartitionModels -> controllerToPartitionModels.keySet())
            .flatMapIterable((Function<Set<String>, Iterable<String>>) name -> name)
            .map(name -> {
                boolean isSyncAll = false; // You can customise as per requirement
                return new Pair<List<PartitionModel>, Boolean>(controllerToPartitionModels.get(name), isSyncAll)
            })
            .flatMap((Function<Pair<List<PartitionModel>, Boolean>, ObservableSource<?>>) pair -> {
                        boolean isSyncAll = pair.first;
                        List<PartitionModel> partitionModels = pair.second;
                        return ITModule.getITService()
                                .refreshPartitionStatus(new ArrayList<>(partitionModels), isSyncAll)
                    }
            )
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(new Action() {
                @Override
                public void run() throws Exception {
                    Logger.get().d(ATTActionManager.this, "Refreshing request sent successfully for list of size : " + partitionModels.size());
                }
            }, (@NonNull Throwable throwable) -> {
                Logger.get().d(ATTActionManager.this, "Error on Refresh request");
            });

}

* Пожалуйста, замените ? с допустимым типом объекта.

...