Метод Zip в RXJava

Angelina спросил: 28 марта 2018 в 04:18 в: android

Я изучаю RX Java, где я бы хотел отправить N параллельных запросов в веб-API, и объединенные результаты будут объединены в один список. Я использую Retrofit с расширениями RXJava для отправки запросов:

@GET("getForkliftDetail")
Observable<ForkliftDetail> getForkliftDetail(
        @Query("lang") String language,
        @Query("id") Integer forkliftId);

Моя функция, которая отправляет запросы, выглядит следующим образом:

List<Observable<ForkliftDetail>> requests = new ArrayList<>();
    for (Forklift item: forkliftParkList) {
        requests.add(service.fetchForkliftDetails(locale, item.getId()));
    }
    Observable.zip(
            requests,
            new FuncN(){
                public ForkliftDetail call(ForkliftDetail... args) {
                    Log.i("RX TEST", args.toString());
                    return new ForkliftDetail();
                }})
            // After all requests had been performed the next observer will receive the Object, returned from Function
            .subscribe(
                    // Will be triggered if all requests will end successfully (4xx and 5xx also are successful requests too)
                    new Consumer<Object>() {
                        @Override
                        public void accept(Object o) throws Exception {
                            //Do something on successful completion of all requests
                        }
                    },                    // Will be triggered if any error during requests will happen
                    new Consumer<Throwable>() {
                        @Override
                        public void accept(Throwable e) throws Exception {
                            //Do something on error completion of requests
                        }
                    }
            );

Тем не менее, я застрял в этом пункте. Ошибка FuncN говорит, что мне нужно реализовать call(Object...). Я думал, что метод FuncN - это то, где я могу добавить все ответы, ForkliftDetail objects, в новый List и вернуть его. Пожалуйста, помогите мне понять это. Заранее благодарю вас!


1 ответ

akarnokd ответил: 28 марта 2018 в 08:48

Попробуйте это:

List<Observable<ForkliftDetail>> requests = new ArrayList<>();
for (Forklift item: forkliftParkList) {
    requests.add(service.fetchForkliftDetails(locale, item.getId()));
}Observable.zip(
    requests,
    new Function<Object[], ForkliftDetail>() {
        @Override
        public ForkliftDetail apply(Object[] args) {
                Log.i("RX TEST", Arrays.toString(args));
                return new ForkliftDetail();
            }
        }
    )
    .subscribe(
        new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
            }
        },
        new Consumer<Throwable>() {
            @Override
            public void accept(Throwable e) throws Exception {
            }
        }
    );