我正在学习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,它发出一个间隔为特定时间间隔的整数序列
我犯了错误或遗忘了什么吗?
答案 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);
}
,我在github中有更多示例