Anurag Singh
Anurag Singh

Reputation: 6200

How to create 2 or two parallel network requests with RxJava2?

I have created two different API requests with Retrofit 2.0 as

Observable<T> getOrganisationList()
Observable<T> getStaffList()

I am using CompositeDisposable container that contains multiple other disposables. I want the above two observable requests to be executed in parallel.

Please, answer the question with the help of the code and not with theory only.

Upvotes: 2

Views: 1601

Answers (1)

Yogi Bear
Yogi Bear

Reputation: 693

Personally, I did it this way (not sure it's the best way to do it though):

public void getEventsComingAndPassed(final Context context, Integer id_user){

    Observable<List<Event>> eventsComingObservable = service
            .getEventsComing(id_user)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

    Observable<List<Event>> eventsPassedObservable = service
            .getEventsPassed(id_user)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

    Observable<NetResponseGetObservableEventsJSON> combined =
            Observable.zip(eventsComingObservable, eventsPassedObservable, new Func2<List<Event>, List<Event>, NetResponseGetObservableEventsJSON>() {
        @Override
        public NetResponseGetObservableEventsJSON call(List<Event> eventsComing, List<Event> eventsPassed) {
            return new NetResponseGetObservableEventsJSON(eventsComing, eventsPassed);
        }
    });

    combined.subscribe(new NetResponseGetObservableEvents(context));
}

Here you can put your two services that will be executed in parallel. I used the zip operator to do it, for more informations you can check the official documentation.

NetResponseGetObserbableEventJSON is a class that contains the 2 lists of events in my case:

public class NetResponseGetObservableEventsJSON {

List<Event> eventsComing;
List<Event> eventsPassed;

public NetResponseGetObservableEventsJSON(List<Event> eventsComing, List<Event> eventsPassed) {
    this.eventsComing = eventsComing;
    this.eventsPassed = eventsPassed;
}

public List<Event> getEventsComing() {
    return eventsComing;
}

public void setEventsComing(List<Event> eventsComing) {
    this.eventsComing = eventsComing;
}

public List<Event> getEventsPassed() {
    return eventsPassed;
}

public void setEventsPassed(List<Event> eventsPassed) {
    this.eventsPassed = eventsPassed;
}}

And finally I have the Subscriber class in which you can handle the response when both services are done:

public class NetResponseGetObservableEvents extends Subscriber<NetResponseGetObservableEventsJSON> {

private Context context;

public NetResponseGetObservableEvents(Context context){

}

@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(NetResponseGetObservableEventsJSON response) {

}}

Hope it helps. And if someone knows a better and proper way to do it I'm interested!

Upvotes: 5

Related Questions