In meiner Android-App verwende ich Domain-Repository-Schnittstelle, die mit lokalen DB unterstützt mit SqlBrite und Netzwerk-API mit Retrofit Observables unterstützt wird. Also habe ich Methode getDomains(): Observable<List<Domain>>
im Repository und zwei entsprechende Methoden in meinem Retrofit und SqlBrite. Ich möchte diese beiden Observablen nicht verketten oder zusammenführen. Ich möchte, dass mein Repository Daten nur von SqlBrite nimmt und da SqlBrite QueryObservable zurückgibt, was onNext()
auslöst, wenn die zugrunde liegenden Daten geändert werden, kann ich meine Netzwerkanforderung unabhängig ausführen und Ergebnisse in SqlBrite speichern und meine Observable mit aus dem Netzwerk abgerufen und in DB gespeichert aktualisieren Daten. Also versuchte ich mein Repository des getDomains()
Methode wie folgt umzusetzen:RxJava Datenfluss mit SqlBrite und Retrofit
fun getDomains(): Observable<List<Domain>> {
return db.getDomains()
.doOnSubscribe {
networkClient.getDomains()
.doOnNext { db.putDomains(it) }
.onErrorReturn{ emptyList() }
.subscribe()
}
}
aber in diesem Fall jedes Mal, sollte der Kunde abonniert, würde jedes Mal, wenn Netzwerkanforderungen machen, dass nicht so gut ist. Ich dachte über andere do...
Betreiber, um Anfragen dorthin zu verschieben, aber doOnCompleted()
im Falle von QueryObservable würde nie aufgerufen werden, bis ich toBlocking()
irgendwo anrufen, was ich nicht, doOnEach()
auch nicht gut, da es Anfragen jedes Mal Element aus Db extrahiert. Ich habe auch versucht, replay()
Operator zu verwenden, aber obwohl das Observable in diesem Fall zwischengespeichert wird, geschieht das Abonnement und führt zu Netzwerkanforderungen. Also, wie kann diese beiden Observables in der gewünschten Weise kombinieren?
, wo der Staat sollte kommen? –
Dies ist ein Implementierungsdetail, das von Ihrem Anwendungsfall abhängt. 'stateDeterminer.getState()' gibt ein 'Observable' zurück. dies könnte eine Überprüfung sein, ob die Datenbank leer ist und dann 'State.NO_DATA' oder eine Zeitbasis-Sache (dh Rückkehr' State.SYNC_IN_BACKGROUND' wird alle 24 Stunden zurückgegeben werden, so dass die Daten einmal am Tag aktualisiert werden) und so weiter . Es hängt wirklich davon ab, was Sie erreichen möchten und wie oft und wann Sie synchronisieren möchten, indem Sie einen Netzwerkanruf ausführen. –
sockeqwe
macht Sinn. Ich möchte neue Daten jedes Mal abrufen, wenn Benutzer die Anwendung starten und "getDomains" zum ersten Mal aufgerufen wird, dann in einer gewissen Zeit, z. 120 Sekunden, wenn subscribe() Anrufe ich nur von db zurückgeben möchte. Wenn Benutzer jedoch die Liste zum Aktualisieren aufklappen, möchte ich Daten aus dem Netzwerk neu laden –