How to repeat network calls using RxJava

android, java, retrofit, rx-android, rx-java

Solution

If you want to use zip, you'd want to do something like this (lambda syntax for brevity):

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 -> {
            // ...
        }
    );

Note: You'd have to either create a Tuple class, or some other object, or import a Tuple library.

Another variation based on your comment:

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

This will run your requests in parallel and your subscription block will receive each element separately.

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

This will collect the resulting tuples in an array.

Problem

I have an API that lets me retrieve an item by an id using something like this: ``` http://myapi.com/api/v1/item/1 ``` Where the last value is the id of the item. This is fine and dandy, I can write a Retrofit service interface and call for the item like this: ``` 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); } }); ``` The problem I run into is that I want to retrieve 5 items at a time, but I don't know how I can do that. If for example I want to get items with id 1, 2, 3, 4, 5, how can I do this in one group? I've looked into `Observable.zip()` but I can't quite figure out how to set this up.

Original source