2016-04-05 6 views
1

Ich benutze Retrofit 2 und ich lerne RxJava. Ich lade eine Liste von Gegenständen von irgendwo herunter. Ich möchte für jedes Element einen API-Aufruf erstellen und eine neue Liste erweiterter Elemente erstellen. Beide Aufrufe geben ein Observable zurück. Es sieht etwa so aus:RxJava api Anruf für jeden Artikel in der Liste und Rückkehrliste der erweiterten Artikel

getItemsService.getItems() 
      .concatMap(Observable::from) 
      .map(item -> new ExtendedItem(item, someOtherService.getDetails(item.somedetail))) 
      .toList() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(activity); 

Die Details Service:

public interface IGetDetailsService { 
@GET(BuildConfig.GET_DETAILS_ENDPOINT) 
Observable<Detail> getDetails(@Query("q") String someDetail); 

}

Das Problem ist, dass getDetails eine beobachtbare zurück und ich kann es nicht ExtendedItem zu konstruieren, verwenden. Das Ändern des getDetails-Aufrufs, um ein Objekt zurückzugeben, funktioniert in der rxJava-Kette nicht, da das Ergebnis an den Hauptthread zurückgegeben wird. Wie bekomme ich das Objekt selbst? Ich habe viele andere Dinge ausprobiert, aber bisher funktioniert nichts.

Antwort

1

Sie können eine der Varianten von flatMap verwenden:

... 
      .concatMap(Observable::from) 
      .flatMap(item -> someOtherService.getDetails(item.somedetail), (item, detail) -> new ExtendedItem(item, detail)) 
      .toList() 
... 
Verwandte Themen