2016-10-21 4 views
3

У меня есть API, который позволяет мне получить элемент с помощью идентификатора, используя что-то вроде этого:Как повторить сетевые вызовы с использованием RxJava

http://myapi.com/api/v1/item/1 

Если последнее значение является идентификатор элемента. Это нормально, и денди, я могу написать интерфейс дооснащения обслуживания и призывают к этому пункту, как это:

MyService service = MyService.retrofit.create(MyService.class); 

service.itemById(1) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(new Subscriber<Item>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 
         Log.v(LOG_TAG, e.getMessage()); 
        } 

        @Override 
        public void onNext(Item item) { 
         adapter.addItem(item); 
        } 
       }); 

Проблема я бегу в том, что я хочу, чтобы получить 5 пунктов, в то время, но я не знаю, как я могу это сделать. Если, например, я хочу получить элементы с идентификаторами 1, 2, 3, 4, 5, как я могу сделать это в одной группе? Я просмотрел Observable.zip(), но я не могу понять, как это установить.

ответ

4

Если вы хотите использовать почтовый индекс, вы хотите сделать что-то вроде этого (лямбда-синтаксис для краткости):

Observable.zip(
    service.itemById(1), 
    service.itemById(2), 
    service.itemById(3), 
    service.itemById(4), 
    service.itemById(5), 
    (i1, i2, i3, i4, i5) -> new Tuple<>(i1, i2, i3, i4, i5)) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeOn(Schedulers.io()) 
    .subscribe(
     tuple -> { 
      // < use the tuple > 
     }, 
     error -> { 
      // ... 
     } 
    ); 

Примечание: Вы должны были бы либо создать класс кортеже или какой-либо другой объект или импортировать библиотеку Tuple.


Другой вариант основан на ваш комментарий:

Observable.range(1, 5) 
    .flatMap(t -> service.itemById(t), (i, response) -> new Tuple<>(i, response)) 
    .subscribeOn(Schedulers.io()) 
    .subscribe... 

Это будет запускать ваши запросы параллельно и подписки блок будет получать каждый элемент по отдельности.


Observable.range(1, 5) 
    .flatMap(t -> service.itemById(t), (i, response) -> new Tuple<>(i, response)) 
    .collect(ArrayList::new, ArrayList::add) 
    .subscribeOn(Schedulers.io()) 
    .subscribe... 

Это будет собирать результирующие кортежи в массиве.

+0

Итак, как бы вы это сделали, если бы я не хотел жестко кодировать значения? Предположим, я хотел взять исходную точку, и с этой точки петли пять? (Почти как пейджер, если это имеет смысл) – AdamMc331

+0

см. Мои изменения выше – drhr

+0

Спасибо за изменения! Я собираюсь попробовать это прямо сейчас. – AdamMc331

0

< Наблюдаемые Список <YourType> > список = Observable.range (/ ... /).map(/ ... /) ToList().

Смежные вопросы