在RxJava 2.X中暂停并恢复基于布尔门的observable?

时间:2016-11-15 17:23:37

标签: android rx-java reactive-programming rx-java2

假设我有一个处理器,当按下按钮时会发出一个布尔值,将其视为切换。

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

有没有人知道如何实现这样的目标?

修改我撰写了一篇关于如何实现这一目标的博文https://medium.com/@scottalancooper/pausing-and-resuming-a-stream-in-rxjava-988a0977b771#.gj7fsi1xk

3 个答案:

答案 0 :(得分:4)

现在RxJava2Extensions库中有一个运算符valve()来执行请求的行为。

答案 1 :(得分:1)

您可以使用默认的RxJava运算符来实现此目的:

    final Random random = new Random();
    final Observable<Boolean> gates = Observable.interval(10, TimeUnit.SECONDS)
            .map(it -> random.nextBoolean())
            .startWith(false)
            .doOnNext(it -> System.out.println("Gate " + (it ? "opened" : "closed")))
            .take(100);
    final Observable<Long> data = Observable.interval(3, TimeUnit.SECONDS)
            .doOnNext(it -> System.out.println("New value " + it))
            .take(100);

    gates.publish(innerGates -> data.publish(innerData -> Observable.merge(
            innerData.window(
                    innerGates.distinctUntilChanged().filter(it -> it),
                    (ignore -> innerGates.distinctUntilChanged().filter(it -> !it))
            ).flatMap(it -> it),
            innerData.buffer(
                    innerGates.distinctUntilChanged().filter(it -> !it),
                    (ignore -> innerGates.distinctUntilChanged().filter(it -> it))
            )
                    .flatMap(Observable::from)
    )))
            .subscribe(it -> System.out.println("On next " + it));

答案 2 :(得分:0)

只需使用带有一个Observable.window参数的现成Observable<T>运算符。