2016-03-23 24 views
1

Mein Szenario ist sehr ähnlich zu diesem Bild:Kombination von RxJava und RxAndroid?

enter image description here

Fluss der App wird so sein:

braucht
  1. Ansicht aktualisiert.
  2. Erstellen Sie eine Observable mit RxAndroid zum Abrufen der Daten aus dem Cache/lokale Datei.
  3. aktualisieren Sie die Ansicht.
  4. Führen Sie einen weiteren Netzwerkanruf mit Retrofit und RxJava aus, um die Ansicht erneut mit neuen Daten aus den Webdiensten zu aktualisieren.
  5. Aktualisieren Sie die lokale Datei mit den neuen Daten.

Also, ich bin die Aktualisierung der Ansicht zweimal (eine von der lokalen Datei und kurz danach durch einen Web Service)

Wie kann ich das Ergebnis erreichen RxJava und RxAndroid mit? Was ich dachte, ist

  1. Erstellen Sie eine Observable1, um die Daten aus dem lokalen Dateisystem zu erhalten.
  2. In der onNext Methode von observable1 kann ich ein weiteres observable2 erstellen.
  3. observable2.onNext() Ich kann die lokale Datei aktualisieren. Jetzt Wie aktualisiere ich die view mit den aktualisierten Daten (in der Datei geladen)?

Was wäre der gute Ansatz?

+0

FYI RXAndroid veraltet und seine funtionality wurde in RXBindings gerollt –

+0

was observable1 emittierende ist? –

Antwort

3

ich dieses gleiche Szenario einen Blog-Post über genau geschrieben. Ich benutzte den merge Operator (wie von sockeqwe vorgeschlagen) Ihre Punkte '2' und parallel '4' zu adressieren, und doOnNext '5' zu adressieren:

// NetworkRepository.java 
public Observable<Data> getData() { 
    // implementation 
} 

// DiskRepository.java 
public Observable<Data> getData() { 
    // implementation 
} 

// DiskRepository.java 
public void saveData(Data data) { 
    // implementation 
} 

// DomainService.java 
public Observable<Data> getMergedData() { 
    return Observable.merge(
    diskRepository.getData().subscribeOn(Schedulers.io()), 
    networkRepository.getData() 
     .doOnNext(new Action1<Data>() { 
     @Override 
     public void call(Data data) { 
      diskRepository.saveData(data); // <-- save to cache 
     } 
     }).subscribeOn(Schedulers.io()) 
); 
} 

In meinem Blogbeitrag zusätzlich ich filter und Timestamp verwendet Überspringen der Aktualisierung der Benutzeroberfläche, wenn die Daten identisch sind oder wenn der Cache leer ist (Sie haben dies nicht angegeben, aber Sie werden wahrscheinlich auch auf dieses Problem stoßen).

Link zum Beitrag: https://medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9

0

Sieht aus wie concat oder merge Operator ist, was Sie für

Der Unterschied zwischen ihnen suchen ist:

Merge die Einzelteile durch den Zusammenschluss entstehenden Observable (ein ähnlicher Operator, Concat emittiert wird, kann verschachteln, tut Objekte nicht verschachteln, sondern alle Objekte der Quelle Observable nacheinander ausstrahlen, bevor sie beginnen, Objekte von der nächsten Quelle Observable auszugeben.

Observable retroFitBackendObservable = retrofitBackend.getFoo().doOnNext(save_it_into_local_file); 
Observable mergedObservable = Observable.merge(cacheObservable, retroFitBackendObservable); 
mergedObservable.subscribe(...); 

Dann für mergedObservable abonnieren und Ihre Ansicht aktualisieren in onNext()