2016-11-04 7 views
3

Ich habe zwei Observables. observableDisconnectContact ist verantwortlich für den Aufruf der API-Anfrage zum Entfernen des Kontakts und es funktioniert ordnungsgemäß. Die zweite observableDeleteContact gibt wahr oder falsch aus, wenn der Kontakt aus der Datenbank entfernt wurde. Ich benutze greeDao.RxJava kombinieren mit booleschen Operatoren

Ich möchte kombinieren beide aber zweite beobachtbare sollte beginnen, wenn zuerst getan wird und wieder wahr. Ich denke über die Verwendung concat() und first(). Aber ich muss wissen, dass beide Ströme aussenden, ist wahr. Also verwende ich combineLatest() oder zip(). Aber es ist keine gute Idee, weil beide Ströme in der gleichen Zeit laufen. Ich habe bemerkt, dass first() Operator nicht funktioniert für zip() und combineLatest().

Wie kann ich beide Observables kombinieren, wo zweite nach dem ersten Stream gestartet wird oder nicht, wenn zuerst falsch zurückgeben und Ergebnis beider Ströme als ein Ergebnis sein sollte.

Observable.combineLatest(observableDisconnectContact, observableDeleteContact, new Func2<Boolean, Boolean, Boolean>() { 
      @Override 
      public Boolean call(Boolean isDisconnectSuccess, Boolean isRemoveSuccess) { 
       return isDisconnectSuccess && isRemoveFromDatabaseSuccess; 
      } 
     }).subscribe(new Subscriber<Boolean>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onNext(Boolean isDeleted) { 
       if (isDeleted) { 
        //TODO 
       } 
      } 
     }); 

Antwort

4
observableDisconnectContact 
     .flatMap(isDisconnectSuccessful -> { 
      if(isDisconnectSuccessful) return observableDeleteContact; 
      else return Observable.just(false); 
     }) 
     .subscribe(isBothActionsSuccessful -> { 
      if(isBothActionsSuccessful) { 
       //success! 
      } else { 
       //something goes wrong 
      } 
     }); 
1
observableDisconnectContact 
    .filter(new Func1<Boolean, Boolean>() { 
     @Override 
     public Boolean call(Boolean aBoolean) { 
      return aBoolean; 
     } 
    }) 
    .flatMap(new Func1<Object, Observable<Boolean>>() { 
     @Override 
     public Observable<Boolean> call(Object o) { 
      return observableDeleteContact; 
     } 
    }); 

beobachtbare Resultierte observableDeleteContact emittieren ‚s führen, wenn observableDisconnectContacttrue emittiert und Filter (nichts emittiert), wenn es false

+0

war es fast gut ist. Wenn 'observableDisconnectContact' false ausgibt, wird es nur 'onComplicted()' aufgerufen. Ist es möglich, falsch auszugeben? – Michael

+0

@Michael es ist möglich, überprüfen Sie bitte meine Antwort –