2017-02-23 4 views
0

Ich habe eine Liste von Objekten: ArrayList<T> arrayList; und auf jedes Objekt der Liste gibt es eine ID: T.getId() die ich brauche, um eine Anfrage zu stellen. Als Antwort eine andere Liste von Objekten abgerufen: T.getId() und auf jeder Antwort möchte ich fusionieren dieses Objekt: T mit der Antwort: ArrayList<E> anotherList auf einem hashmap: ArrayList<E> anotherListMehrere Retrofit2 Anfragen fusioniert auf hashmap mit rxJava2

ich mehrere Anrufe auf der Basis der id machen wollen Hashmap<T, ArrayList<E> anotherList> und Geben Sie den Wert zurück, nachdem alle Anforderungen abgeschlossen wurden. Gibt es eine Weise, die ich dies mit rxJava erreichen kann:

//For every `T.getId()`, fetch `ArrayList<E> anotherList` 
for(int i=0; i<arrayList.size(); i++){ 
    T object = arrayList.get(i); 
    fetchData(T.getId()); 
} 

auf jeden onNext() merge (hashmap.put()) T mit Antwort ArrayList<E> anotherList auf Hashmap<T, ArrayList<E> anotherList>. Nachdem alle Anfragen endgültig hashmap enthält jene Paare zurückgeben beendet:

retrofit.fetchData(T.getId()) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .flatMap(...) 
     .merge(...) 
     .subscribeWith(...) 

Gibt es eine Weise, die ich dies erreichen können?

Antwort

0

Ich denke, Sie ein Feld erstellen: private HashMap<Integer,ArrayList<E>> mHashMap;

Sobald dieses Feld Instanciate war, können Sie versuchen:

Observable.just(arrayList) 
       .flatMapIterable(new Function<ArrayList<T>, Iterable<? extends T>>() { 
        @Override 
        public Iterable<? extends T> apply(ArrayList<T> ts) throws Exception { 
         return ts; 
        } 
       }).flatMap(new Function<T, ObservableSource<Hashmap<T,ArrayList<E>>>>() { 
        @Override 
        public ObservableSource<Hashmap<T,ArrayList<E>>> apply(T t) throws Exception { 
         return Observable.fromCallable(new Callable<Hashmap<T,ArrayList<E>>>() { 
          @Override 
          public Hashmap<T,ArrayList<E>> call() throws Exception { 
           mHashMap.put(t, fetchData(t.getId())); 
           return mHashMap; 
          } 
         }); 
        } 
       }); 

flatMapIterable es Gebrauch ist jedes Element des arrayList zu bekommen und flatMap ermöglicht es Ihnen, Verwenden Sie jedes Element, um eine zugehörige Observable zu erstellen, die Sie benötigen.

Dann mit einem DisposableObserver auf dem onNext Rückruf erhält die Zwischen HashMap<Integer,ArrayList<E>> und auf dem onCompleted Rückruf abgeschlossen vollständig ausgefüllten HashMap

Hoffnung, das hilft.

Entschuldigung für mein Englisch.

Verwandte Themen