read

Sometimes we need to get some data before do something else, each one can be from different sources, like 2 different web services.

Using Retrofit 1.9 and retrolambda

  • NewOrder is the object that we need to create from 2 data sources, both getted from an Observable<Address>.
class NewOrder {

...

public NewOrder(Address dropAddress, Address pickAddress){
...
}

}

The Retrofit service that consumes the object and creates the final Observable:

@POST("url")
Observable<Order> create(@Body NewOrder id);
  • We will have 2 Observables to wait for result: pickObservable and dropObservable. (can be more! just add each Observable to combineLatest`)

  • Address.get(...) is a function that will return an observable with the address for that LatLng.

  • Use Observable.combineLatest to combine both pickObservable and dropObservable and wait for it´s results and will end in a new Observable<NewOrder>.

  • Use flatMap to apply

public static Observable<Order> create(final OrderData orderData) {
// Prerequisites
Observable<Address> pickObservable = Address.get(new LatLng(1.2. -1,2));
Observable<Address> dropObservable = Address.get(new LatLng(1.2. -1,2);

// Create a new Observer that will end until both observables get data.
Observable<NewOrder> newOrderObservable =
Observable.combineLatest(pickObservable, dropObservable
(pickAddress, dropAddress,) ->
new NewOrder(pickAddress, dropAddress)
);

// create new observable from last observable.
return newOrderObservable.flatMap(order -> create(order));
}

private static Observable<Order> create(OrderService.NewOrder newOrder) {
return SERVICE.createOrder(newOrder);
}

Thanks to lukaciko. Check this question on stackoverflow.

Blog Logo

Daniel Gomez Rico


Published

Image

MakinGIANTS

The findings and tips records of an Android-iOS-TheWholeShabang group

Back to Overview