如何使用RxJava Interval Operator

时间:2016-06-06 08:38:42

标签: rx-java

我正在学习RxJava运算符,我发现下面这些代码没有打印任何内容:

public static void main(String[] args) {

    Observable
    .interval(1, TimeUnit.SECONDS)
    .subscribe(new Subscriber<Long>() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            System.out.println("onError -> " + e.getMessage());
        }

        @Override
        public void onNext(Long l) {
            System.out.println("onNext -> " + l);
        }
    });
}

作为ReactiveX,interval

  

创建一个Observable,它发出一个间隔为特定时间间隔的整数序列

我犯了错误或遗忘了什么吗?

3 个答案:

答案 0 :(得分:16)

你必须阻止直到观察到消耗:

public static void main(String[] args) throws Exception {

    CountDownLatch latch = new CountDownLatch(1);

    Observable
    .interval(1, TimeUnit.SECONDS)
    .subscribe(new Subscriber<Long>() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
            // make sure to complete only when observable is done
            latch.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println("onError -> " + e.getMessage());
        }

        @Override
        public void onNext(Long l) {
            System.out.println("onNext -> " + l);
        }
    });

    // wait for observable to complete (never in this case...)
    latch.await();
}

例如,您可以添加.take(10)以查看可观察的完整内容。

答案 1 :(得分:5)

在订阅后放置Thread.sleep(1000000),您将看到它正常工作。 Observable.interval默认情况下Schedulers.computation()运行,因此您的流正在主线程以外的线程上运行。

答案 2 :(得分:0)

正如他们告诉你的那样,间隔工作是异步的,所以你必须等待所有的事件完成。

订阅后您可以获得订阅,然后使用属于reactiveX平台的TestSubcriber,它将为您提供等待所有事件终止的功能。

       @Test
public void testObservableInterval() throws InterruptedException {
    Subscription subscription = Observable.interval(1, TimeUnit.SECONDS)
              .map(time-> "item emitted")
              .subscribe(System.out::print,
                         item -> System.out.print("final:" + item));
    new TestSubscriber((Observer) subscription)
            .awaitTerminalEvent(100, TimeUnit.MILLISECONDS);
}

如果您需要https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java

,我在github中有更多示例