2017-06-01 3 views
-1

Ich habe zwei verschiedene API-Anfragen erstellt mit Retrofit 2.0 alsWie erstellt man zwei oder zwei sequentielle Netzwerkanforderungen mit RxJava2?

Observable<T> getOrganisationList() 
Observable<T> getStaffList() 

ich CompositeDisposable Container verwende, die auf mehrere andere Disposables halten kann. Ich möchte die beiden oben genannten beobachtbaren Anfragen nacheinander ausgeführt werden (getStaffList() nach getOrganisationList()) nur dann, wenn:

  1. getOrganisationList() nicht Anforderungszeit nicht wirft
  2. getOrganisationList() nicht wirft keine Netzwerk-Ausnahme bei keinem Netzwerk verfügbar
  3. getOrganisationList() nicht zeigt durch Senden eines Ergebniscode in json Objekt
  4. getOrganisationList() nicht JSONException nicht wirft beim Parsen des Ergebnisses nicht Session-Timeout
  5. getOrganisationList() nicht zurückkehrt null oder leer Ergebnis

Bitte beantworten Sie die Frage mit Hilfe des Codes.

+2

Sie sollten nur mit 'Observable.concat()' in Ordnung sein. In allen Fällen, die Sie beschrieben haben, wird eine Ausnahme ausgelöst, mit Ausnahme des leeren Ergebnisses. Das heißt, "onError" wird im Subscriber aufgerufen und das zweite beobachtbare 'getStaffList()' in concat wird nicht realisiert. Sie können leere Ergebnisse beispielsweise im Operator 'flatmap()' verarbeiten und auch in diesem Fall eine Ausnahme auslösen. – skywall

+0

Was @skywall sagte, mit dem Zusatz von '.switchIfEmpty (Observable.error (...))' –

+2

@TassosBassoukos Ich bin mir nicht sicher, dass Sie Recht haben. 'switchIfEmpty()' wird aufgerufen, wenn kein Element ausgegeben wird. In diesem Fall wird eine leere Liste ausgegeben. – skywall

Antwort

2

Zuerst, wenn Sie RxJava2 und Retrofit2 verwenden, ersetzen Sie Ihre Observable durch Single. Ergebnis von Single ist genau ein onSuccess() oder genau ein onError() Methodenaufruf. Observable ist allgemeiner.

Sie sollten Ihre API-Aufrufe an Orte hinzufügen, die als (1) und (2) markiert sind. Anstelle Ihres generischen Typs T habe ich String und Integer verwendet, um sicherzustellen, dass Code kompiliert werden kann.

+0

Vielen Dank für die sehr spezifische Erklärung. Lass es mich umsetzen. Ich werde irgendwann zurückkehren. In der Zwischenzeit, wenn Sie eine Antwort für die stackoverflow.com/q/44322223/2870088 vorschlagen könnte, die dieser Frage entgegengesetzt ist. Es wäre eine große Hilfe. –

+0

Ich bin dabei, dies zu wählen, da diese Antwort mir in gewissem Maße beim Führen geholfen hat. –

Verwandte Themen