无法在newThread上订阅Observable

时间:2015-03-19 01:46:32

标签: rx-java

此代码有效

Observable.range(0, 9)
    .subscribe(new Action1<Integer>() {
        public void call(Integer item) {
            LOG.debug("item:{}", item);
        }
});

获取:DEBUG:net.test.rx2.App - item:0到9.但是下一个跳过订阅。请告知如何捕捉Observable。

Observable.range(0, 9)
    .subscribeOn(Schedulers.newThread())
    .subscribe(new Action1<Integer>() {
        public void call(Integer item) {
            LOG.debug("item:{}", item);
        }
});

1 个答案:

答案 0 :(得分:2)

这两个例子对我来说都很好。我的猜测是你在应用程序的main方法中测试它。第二个示例在新线程上运行observable,因此主线程不再具有阻塞语句。由于没有阻塞主线程,JVM决定可以终止应用程序。你需要以某种方式阻塞主线程,以便JVM不会过早地关闭你的应用程序(即在Observable发出任何事件之前)。

例如,您可以添加一个简单的System.in.read语句来阻止主线程:

public static void main(String[] args) throws IOException {
    Observable.range(0, 9)
        .subscribeOn(Schedulers.newThread())
        .subscribe(new Action1<Integer>() {
            public void call(Integer item) {
                LOG.debug("item:{}", item);
            }
        });

    System.in.read(); // block to prevent premature JVM shutdown
}

现在你应该能够观察到可观察表达式的结果。