2017-03-01 2 views
0

Ich muss Daten anzeigen, die aus meiner Datenbank kommen, wenn der Benutzer die App startet (sie sind sofort verfügbar), und dann muss ich sie durch Daten ersetzen, die aus dem Netzwerk kommen wie sie verfügbar sind.Anrufe nacheinander mit RXJava tätigen

habe ich versucht, dies zu tun, dass:

mDisposable = mRepository.getHighlights(forceReload) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribeWith(new DisposableObserver<PaginatedData<List<Article>>>() { 
      @Override 
      public void onNext(PaginatedData<List<Article>> articles) { 
       mView.updateData(articles.getData(), articles.isFirstPage(), articles.isLastPage()); 
      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onComplete() { 
      } 
     }); 

und die getHighlights() -Methode:

return Observable.concat(getHighlightsFromDataBase(), getHighlightsFromNetwork()).map(new Function<List<ArticleResponse>, PaginatedData<List<ArticleResponse>>>() { 
      @Override 
      public PaginatedData<List<ArticleResponse>> apply(@NonNull List<ArticleResponse> articleResponses) throws Exception { 
       // ... 
      } 
     }); 

Das Problem ist, dass es nur Anrufe "apply()" (in der "Karte" Methode), wenn getHighlightsFromDataBase() UND getHighlightsFromNetwork() ausgeführt werden.

Anstatt also diese Reihenfolge aufweist:

getHighlightsFromDataBase() 
getHighlightsFromNetwork() 
map() 
onNext() 
map() 
onNext() 

Ich habe müssen:

getHighlightsFromDataBase() 
map() 
onNext() 
getHighlightsFromNetwork() 
map() 
onNext() 

Die "OnNext", die ich über ist die OnNext der Methode, die getHighlights nennt rede(); (damit ich die Ansicht jedes Mal aktualisieren kann, wenn ich neue Daten habe).

Was kann ich tun, um das zu erreichen?

Danke!

+0

Also warum nicht einfach Karte für jede Observable separat anwenden? – yosriz

+1

Ich würde sagen, Ihr Code sieht gut aus und sollte genau das tun, was Sie erwarten: Laden Sie zuerst aus der DB, dann aus dem Netzwerk. "Concat" wird jedoch "getHighlightsFromNetwork()" abonnieren, sobald "getHighlightsFromDatabase" 'onCompleted' ausgegeben hat. Wenn ich mich nicht irre, kann dies sein, bevor oder nachdem das letzte/einzige Element von 'getHighlightsFromDatabase' die' map' durchlaufen hat. Sie können versuchen, einige künstliche Verzögerungen hinzuzufügen, um das Verhalten deutlicher zu sehen. –

+0

Oh, und nur für den Fall, dass Sie wörtlich in Ihrer "erwarteten Reihenfolge" Teil als ich zuerst dachte: * Natürlich * getHighlightsFromNetwork() 'wird am Anfang aufgerufen werden - da es als Argument für verwendet wird 'concat', es muss ausgewertet werden, bevor Sie überhaupt auf die' Karte' kommen - Java hat immerhin noch eine strenge (im Gegensatz zu faulen) Auswertung. "GetHighlightsFromNetwork" muss jedoch ein "Observable" zurückgeben und das * -Abonnement für das Observable * wird faul sein - wie ich oben sagte, wird es nach dem "onCompleted" von "getHighlightsFromDataBase" geschehen. –

Antwort

0

So ähnlich?

getHighlightsFromDataBase().map().doOnNext() {  
     getHighlightsFromNetwork().map().onNext() 
    } 
Verwandte Themen