2016-11-15 4 views
5

Предположим, у меня есть процессор, который генерирует логическое значение, когда нажата кнопка, подумайте об этом как о переключении.Пауза и возобновление наблюдаемого на основе логических ворот в 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); 
       } 
      })); 

То, что я хотел бы сделать, это использовать значение ворота, чтобы сделать паузу и возобновить наблюдаемую последовательность, буферную излучаемое значение во время паузы.

Я читал об этом много, и хотя это кажется возможным в реактивных расширениях для других языков, RxJava, похоже, не поддерживает его.

Вот пример того, чего я хотел бы достичь, он просто выводит инкрементное значение каждую секунду. При нажатии кнопки я хочу, чтобы остановить выход, пока я снова не нажмете ее, который должен выводить каждый элемент, испускаемый между двумя нажатиями кнопки на:

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); 
        } 
       }); 

Кто-нибудь знает, как достичь чего-то вроде этого?

Edit я написал в блоге о том, как достичь этого https://medium.com/@scottalancooper/pausing-and-resuming-a-stream-in-rxjava-988a0977b771#.gj7fsi1xk

+0

Для этого требуется специальный оператор, и у меня есть возможная реализация для RxJava 1 [здесь] (https://gist.github.com/akarnokd/1c54e5a4f64f9b1e46bdcf62b4222f08). – akarnokd

+0

@akarnokd Знаете ли вы о RxJava 2, чтобы узнать, могу ли я легко преобразовать его? Я читал, что создание пользовательских операторов сложно, поэтому я не думаю, что я на этом уровне. –

ответ

4

В библиотеке RxJava2Extensions теперь есть оператор valve(), который выполняет запрошенное поведение.

+0

Удивительно, что вы можете добиться, когда подключаете его к жизненному циклу Android. – ikarhun

0

Просто используйте готовый Observable.window оператор, который принимает один параметр Observable<T>.

+0

Не будет ли это испускать источник, наблюдаемый при выходе из строя наблюдаемого затвора? Я хочу, чтобы источник излучал, пока ворота не исправили ложь. –

+0

Ах, действительно, вы можете использовать 2-параметр для открытия и закрытия исходящего 'истинного' /' ложного. –

+0

Это работает, если я говорю ему открывать, когда есть истинное значение и закрывается, когда есть ложь, но он не буферизует испускаемые элементы, когда окно закрыто, оно просто отбрасывает их. Я также просто понял, что и буфер, и окно выделяют только партии, а не поток, поэтому ни один из операторов не будет работать. –