如何创建连续发出的R​​xJava Observable?

时间:2016-12-22 02:44:25

标签: rx-java observable rx-java2

我正在尝试创建一个RxJava BlockingObservable,它将每隔X毫秒发出一个变量值,直到(condition == true)或发生超时。

下面的代码似乎接近我想要的,但它总是发出ONCE然后退出。奇怪的是,我在takeUntil()中有一个永远不会成立的条件 - 我希望这个可观察到的是连续发射并最终超时,但它并没有。

我在这里错过了什么/做错了什么?

Observable.fromCallable(() -> getSendWindow())
        .sample(10, TimeUnit.MILLISECONDS)
        .timeout(30, TimeUnit.SECONDS)
        .takeUntil(sendWindow -> 1==2)
        .doOnError(throwable -> log.warn("Timed out waiting for send window to clear. Giving up."))
        .doOnCompleted(() -> {
            log.info("Send window cleared");
        })
        .toBlocking().forEach(sendWindow -> log.info("sendWindow={}, getSendWindow());

1 个答案:

答案 0 :(得分:2)

.sample不会按照您的想法执行。采样率将上述Observable限制为(最多)每10秒一次。

Observable.fromCallable()只发出一次事件,然后完成。

.sample()等待10秒,每隔10秒发出最后一个事件(如果有的话)。因此,当您将它附加到只有一个事件的Observable时,它只会发出一个事件。然后就完成了。

你真正想要的是什么(我是.net程序员,请原谅我的外壳等)就是这样。

编辑:感谢@akanokd告诉我java使用重复事件的间隔。

Observable.interval(10, timeUnit.MILLISECONDS)
    .map(x -> getSendWindow())
    .takeUntil(sendWindow -> 1==2)
    .doOnError(throwable -> log.warn("Timed out waiting for send window to clear. Giving up."))
     .doOnCompleted(() -> {
            log.info("Send window cleared");
        })
    .toBlocking().forEach(sendWindow -> log.info("sendWindow={}, getSendWindow());

可以使用对JAVA特定版本的API调用来编辑此答案...