2017-07-17 7 views
1

Ich habe ein Problem mit meiner RxJava-Callchain. Die toList funktioniert nicht richtig. Ich würde vermuten, dass die toList() etwas zu vervollständigen braucht. Deshalb ist es fest. Aber ich weiß nicht, wie dieses ProblemRxjava tolist() nicht abgeschlossen

Der Code

 mModel.getLocations() 
      .flatMapIterable(new Function<List<Location>, List<Location>>(){ 
       @Override 
       public List<Location> apply(final List<Location> locations) throws Exception { 
        return locations; 
       } 
      }) 
      .filter(new Predicate<Location>() { 
       @Override 
       public boolean test(final Location location) throws Exception { 
        return location.searchExistInNameOrKeyWord(input); 
       } 
      }) 
      .toList() 
      .map(new Function<List<Location>, List<Location>>() { 
       @Override 
       public List<Location> apply(List<Location> locations) throws Exception {      
        /** Doing some random work with the list and then returning */ 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Consumer<List<Location>>() { 
       @Override 
       public void accept(final List<Location> locations) throws Exception { 
        mView.setAdapterItems(locations); 
       } 
      }); 

Vielleicht hat jemand zu lösen, die viel besser ist als ich bei RxJava ist, könnte genau feststellen, was ich falsch mache.

aktualisieren

@Query("SELECT * from location") 
Flowable<List<Location>> loadAllLocations(); 

Die mModel.getLocations() nur die loadAllLocations ruft wie oben vom Zimmer percistance Speicher

+0

Nun, ist "mModel.getLocations()" tatsächlich abgeschlossen? –

+0

hat dem Beitrag einige weitere Informationen hinzugefügt. Das einzige, was es tut, ist, die loadAllLocations aus dem Speicher aufzurufen –

Antwort

6

ich vorher noch nie Zimmer benutzt habe, aber nach diesem Artikel: https://medium.com/google-developers/room-rxjava-acb0cd4f3757

Jetzt wird jedes Mal, wenn die Benutzerdaten aktualisiert werden, unser Flowable-Objekt ausgegeben automatisch, so dass Sie die Benutzeroberfläche basierend auf den neuesten Daten aktualisieren können. Der Flowable wird nur ausgegeben, wenn das Abfrageergebnis mindestens eine Zeile enthält. Wenn keine Daten für die Abfrage vorhanden sind, wird der Flowable weder onNext noch onError ausgegeben.

So Flowable reagiert auf jeder Datenänderung und das bedeutet onComplete würde nie genannt werden. In diesem Fall können Sie den Operator toList() nicht verwenden, da dieser Stream niemals abgeschlossen wird.

0

Der Schlüsselpunkt für den Operator toList() ist, dass er auf die Ausgabe aller Elemente wartet. Sobald es fertig ist, muss die onComplete() -Methode aufgerufen werden und dort werden wir unser wünschenswertes Ergebnis erhalten. Wenn wir onComplete() nicht verwenden oder aus irgendeinem Grund onComplete() nicht aufgerufen wird, wird nichts gedruckt.

Verwandte Themen