2016-06-18 35 views
0

Ich bin noch relativ neu in Rx-Java und reaktive Programmierung im Allgemeinen.Bedingung zu Observable hinzufügen (rx-java)

Heres mein aktueller Code. Was es jetzt tut:

  1. prüfen Gerät, wenn Daten vorhanden sind
  2. Falls vorhanden, holen sie
  3. Falls nicht vorhanden, holen vom Server

    Observable<PastPaper> observable = Observable.concat(
         helper.loadFromDevice(params), 
         helper.loadFromServer(params)) 
         .takeFirst(pastPaper -> pastPaper != null); 
    
    observable.subscribe(....); 
    

Was ich m versuchen zu erreichen:

  1. Kontrollgerät, wenn Daten vorhanden sind
  2. Falls vorhanden, holen sie
  3. Falls nicht vorhanden, überprüfen Sie, ob Internet-Verbindung aktiv ist
  4. Wenn Internet-Verbindung aktiv ist, holen vom Server

Wie kann ich das hinzufügen Überprüfen Sie die Internetverbindung nach den oben genannten Schritten? (habe schon eine Methode).

Jede Hilfe wird geschätzt. Danke

Side Frage: Kann mein Code oben verbessert werden?

Antwort

0

Sie könnten switchOnError verwenden, so dass der loadFromServer Aufruf ignoriert wird, wenn es fehlschlägt. Aus Gründen der Vernunft könnten Sie einen Fehler vom Server als Warnung protokollieren:

Observable<PastPaper> observable = Observable.concat(
    helper.loadFromDevice(params), 
    helper.loadFromServer(params) 
      .doOnError(e -> log.warn(e.getMessage())) 
      .switchOnError(e -> Observable.empty()) 
    .takeFirst(pastPaper -> pastPaper != null); 

Andernfalls, wenn Sie Ihre Internetverbindung aktiv beobachtbar (ein Observable<Boolean> sagen) nutzen möchten, verwenden flatMap:

Observable<PastPaper> observable = Observable.concat(
    helper.loadFromDevice(params), 
    internetAvailable 
     .filter(x -> x) 
     .flatMap(x -> helper.loadFromServer(params))) 
    .takeFirst(pastPaper -> pastPaper != null); 
0

Artificial runnable Beispiel: mit lokalen starten, um Remote-Schalter, wenn lokale leer ist, Rückkehr Standardwert, wenn Netzwerk verfügbar ist nicht

 Observable<Integer> local = Observable.fromCallable(() -> 1); 
     Observable<Integer> remote = Observable.fromCallable(() -> 2); 
     Observable<Boolean> hasInternet = Observable.fromCallable(() -> true); 
     Integer noLocalNoInetVal = 42; 

     Observable<Integer> localOrEmpty = local.filter(localVal -> localVal != null); 
     Observable<Integer> remoteWithInet = hasInternet 
               .filter(inetAvailable -> inetAvailable) 
               .flatMap(__ -> remote); 

     Observable<Integer> localOrRemote = localOrEmpty.switchIfEmpty(remoteWithInet) 
               .firstOrDefault(noLocalNoInetVal);