2016-06-04 11 views
1

Ich arbeite in einer GUI und ich habe mehrere Arten von Ereignissen, die möglicherweise eine Schaltfläche deaktiviert werden. Ich habe verschiedene Möglichkeiten versucht, diese beiden Observablen zu kombinieren, aber jede Lösung, die ich gefunden habe, hat beide Observables dazu gezwungen, ein Ereignis zu veröffentlichen, bevor ein Ergebnis produziert wird. Zum Beispiel in diesem Code:RxJava Zip, die auf jede Änderung von beiden Elternteilen wirkt

public class Test { 

    public static void main(String[] args) { 
     PublishSubject<Boolean> conditionAStream = PublishSubject.create(); 
     PublishSubject<Boolean> conditionBStream = PublishSubject.create(); 

     conditionAStream 
       .zipWith(conditionBStream, (conditionA, conditionB) -> conditionA && conditionB) 
       .subscribe(result -> System.out.println(result)); 

     conditionAStream.onNext(false); 
     conditionBStream.onNext(false); 
     //Expected output: false 

     conditionAStream.onNext(true); 
     //Expected output: false 

     conditionBStream.onNext(true); 
     //Expected output: true 

     conditionAStream.onNext(false); 
     //Expected output: false 
    } 
} 

Aber der Ausgang ich erhalte, ist:

false 
true 

Gibt es eine Möglichkeit zu Observable zu kombinieren, so dass sie „Cache“ das letzte Ergebnis und auf jede Veränderung reagieren ?

Antwort

1

Sie suchen nach combineLatest(), die jedes Mal emittieren wird, wenn eine der kombinierten Observablen emittiert. Es muss immer noch mindestens eine von ihnen emittieren, aber Sie können .startWith() zu all Ihren kombinierten Observablen hinzufügen, um sicherzustellen, dass sie eine erste Emission haben.