2016-03-29 5 views
2

I Rxjava und Retrofit2.0 in meinem Projekt verwendet, sieht es so aus:wie verschachtelte Netzwerk Anfrage Verwendung rxjava schreiben + retrofit2

Observable<List<A>> getAFromServer(); 
Observable<List<B>> getBFromServer(@Body A.a); 

Wenn ich reaktive Art und Weise nicht verwende, wird es sein, dies:

List<A> listA = getAFromServer(); 
foreach(A a: listA){ 
     getBFromServer(a.a) 
} 

Also, meine Frage ist, wie man Rxjava verwendet, um dies zu erreichen und welcher Operator zu verwenden?

+2

sehen diese Frage: http://stackoverflow.com/questions/26356852/how-to-wait-mulitple-nested-async-calls-by-using-of-rxjava-android – hehe

+0

Fest Sprache Dinge im Zusammenhang und Räume. – mentat

Antwort

8

Mit Rx können Sie endlich aufhören, über Netzwerkanforderungen zu "nisten".

Wenn Sie darüber nachdenken, wollten Sie nie wirklich Netzwerkanforderungen "verschachteln", richtig? Das war nur, wie der Code endete, weil Sie nur AsyncTask s oder andere Rückrufe zu Ihrer Verfügung hatten.

Mit Rx können Sie endlich Code schreiben, der in seiner Struktur ähnelt dem, was Sie wollen tatsächlich, die -Chain-Netzwerk anfordert ist: Erste eine Sache tun, dann ein anderer tun.

getAFromServer() 
    .flatMap(new Func1<List<A>, Observable<A>>() {  
     @Override 
     public Observable<A> call(List<A> list) { 
      // the first flatMap is just a trick to "flatten" the Observable 
      return Observable.from(list); 
     } 
    }) 
    .flatMap(new Func1<A, Observable<B>>() { 
     @Override 
     public Observable<A> call(A someA) { 
      return getBFromServer(someA.a); 
     } 

    }) 
    .subscribe(...);