Reputation: 6200
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
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