2017-03-28 7 views
1

Ich habe einen Bildschirm, der eine Liste von Elementen zeigt.Android, Java RX, asynchron

  • Zuerst möchte ich die Elemente aus der lokalen Datenbank anzeigen.
  • Nachdem der Benutzer die lokalen Elemente angezeigt hat, überprüfen Sie das Internet und aktualisieren Sie sie (wenn das Gerät über Internet verfügt).

Ich habe die folgenden Codefragmente

Observable<Data> fetchFromdisk = ...; 
Observable<Data> fetchFromNetwork = ...; 

Observable<Data> fetchData= Observable.concat (fetchFromdisk ,fetchFromNetwork); 

Dann

mSubscriptions.clear(); 
Subscription subscription = fetchData 
     .subscribeOn(mSchedulerProvider.computation()) 
     .observeOn(mSchedulerProvider.ui()) 
     .subscribe(
       new Subscriber<List<Data>>() { 
        @Override 
        public void onCompleted() { 
         view.setLoadingIndicator(false); 
        } 

        @Override 
        public void onError(Throwable e) { 
         processError(e); 
        } 

        @Override 
        public void onNext(List<Data> data) { 
         processData(data); 
        } 
       } 

     ); 
mSubscriptions.add(subscription); 

folgende ich tue Aber was passiert ist, ist, dass fetchFromdisk zum ersten Mal ausgeführt wird, dann wird FetchFromNetwork ausgeführt. Sobald die emittierenden Elemente enden, beginnt die Ausführung von ProcessData.

Das ist genau das Gegenteil von dem, was ich erreichen möchte. Ich möchte den Benutzer priorisieren, um die Daten schnell zu sehen und dann ins Internet gehen. was mache ich falsch?

+0

Side Punkt, Sie sollten – Sourabh

+0

@Sourabh ich schon versucht, aber es hat nicht funktioniert entweder – user60108

+0

Nein, Seite Punkt, ich bin nicht sein mit 'Schedulers.io()' werden, um eine Lösung für Ihr Problem zu sagen, aber du solltest sowieso io verwenden – Sourabh

Antwort

0

Sie können die Methode .doOnCompleted aufrufen, um Ihren Code auszuführen, nachdem der Cache extrahiert wurde.

mSubscriptions.clear(); 
Subscription subscription = fetchData 
    .subscribeOn(mSchedulerProvider.computation()) 
    .doOnCompleted(new Action0<List<Notification>>() { 
       @Override 
       public void call(List<Data> cachedData) { 
         // Get data from server here. 

         // Compare new data against cached data. 

         // Update cache. 

         // Process new data. 
       } 
      }) 
    .observeOn(mSchedulerProvider.ui()) 
    .subscribe(
      new Subscriber<List<Data>>() { 
       @Override 
       public void onCompleted() { 
        view.setLoadingIndicator(false); 
       } 

       @Override 
       public void onError(Throwable e) { 
        processError(e); 
       } 

       @Override 
       public void onNext(List<Data> data) { 
        processData(data); 
       } 
      } 

    ); 
    mSubscriptions.add(subscription); 

///////// Non Lösung Tipp ////////

Versuchen Sie, eine Einzel anstelle eines beobachtbaren verwendet wird, kann es loszuwerden, die OnCompleted bekommen. https://github.com/lettuce-io/lettuce-core/issues/139

0

Es könnte sein, dass Ihr Abonnent eine Liste und nicht Daten zurückgibt?

Sind Sie sicher, dass Sie den richtigen Beobachter verwenden? Der Concat-Operator sollte einen Observer mit demselben Element zurückgeben.

Observable<String> a = Observable.just("a"); 
    Observable<String> b = Observable.just("b"); 

    Observable<String> ab = Observable.concat(a,b); 

    ab.subscribe(new Subscriber<String>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(String s) { 
      Log.d("onNext", s); 
     } 
    }); 
Verwandte Themen