2016-11-15 10 views
5

Powiedzmy, że mam procesor, który emituje wartość boolowską, gdy naciśnięty jest dowolny przycisk, potraktuj to jako przełączenie.Zatrzymaj i wznów obserwowalne na podstawie bramki logicznej w RxJava 2.X?

boolean gateValue = true; 
    PublishProcessor<Boolean> gate = PublishProcessor.create(); 
    view.onButtonClicked() 
      .subscribe(new Action1<Void>() { 
       @Override 
       public void call(final Void aVoid) { 
        gate.onNext(gateValue = !gateValue); 
       } 
      })); 

Co chciałbym zrobić, to użyć wartości bramy, aby wstrzymać i wznowić zaobserwowania sekwencję, buforowanie wartości emitowanych podczas pauzy.

Wczytałem się w to dużo i chociaż wydaje się to możliwe w reaktywnych rozszerzeniach dla innych języków, RxJava wydaje się nie obsługiwać tego.

Oto przykład tego, co chciałbym osiągnąć, po prostu generuje przyrostową wartość w każdej sekundzie. Po naciśnięciu przycisku chcę wyjście zatrzymać aż naciśnij go ponownie, który powinien wypisać każdy element emitowane pomiędzy dwoma przyciskami pras:

Flowable.interval(1, TimeUnit.SECONDS) 
       .bufferWhile(gate) 
       .flatMapIterable(longs -> longs) 
       .subscribe(new Consumer<Long>() { 
        @Override 
        public void accept(final Long aLong) throws Exception { 
         view.displayTime(aLong); 
        } 
       }); 

Czy ktoś zna sposób, aby osiągnąć coś takiego?

Edit pisałem na blogu o tym, jak osiągnąć ten https://medium.com/@scottalancooper/pausing-and-resuming-a-stream-in-rxjava-988a0977b771#.gj7fsi1xk

+0

Wymaga to niestandardowego operatora i mam możliwą implementację dla RxJava 1 [tutaj] (https://gist.github.com/akarnokd/1c54e5a4f64f9b1e46bdcf62b4222f08). – akarnokd

+0

@akarnokd Czy wiesz wystarczająco dużo o RxJava 2, aby wiedzieć, czy mogę go łatwo przekonwertować? Czytałem, że tworzenie niestandardowych operatorów jest trudne, więc nie sądzę, żebym był na tym poziomie. –

Odpowiedz

4

Istnieje teraz operator valve() w bibliotece RxJava2Extensions, który wykonuje żądane zachowanie.

+0

To niesamowite, co możesz osiągnąć po podłączeniu go do cyklu życia Androida. – ikarhun

0

Wystarczy użyć gotowych Observable.window operatora, który przyjmuje jedną Observable<T> parametr.

+0

Czy to nie tylko emitowałoby ze źródła obserwowalne, gdy emituje się brama obserwowalna? Chcę, aby źródło emitowało, dopóki brama nie wyśle ​​fałszywego. –

+0

Ach, rzeczywiście - można użyć parametru 2, aby otworzyć i zamknąć komunikat "true"/"false being". –

+0

Działa to, gdy mówię, aby otworzyć, gdy istnieje wartość true i zamknąć, gdy istnieje fałsz, ale nie buforuje emitowanych elementów, gdy okno jest zamknięte, po prostu je upuszcza. Właśnie zdałem sobie sprawę, że zarówno bufor, jak i okno emitują tylko elementy w partiach, a nie strumień, więc żaden z operatorów nie zacznie działać. –

Powiązane problemy