2015-03-19 153 views
0

此代码的工作无法订阅可观察的上newThread

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

越来越:DEBUG:net.test.rx2.App - 项目:0到9,但下面一个跳过订阅的。请告知如何捕捉Observable。

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

回答

2

这两个例子都适合我。我的猜测是你正在测试应用程序的主要方法。第二个示例在新线程上运行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 
} 

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

+0

非常感谢。你是对的。如何将处理返回到主线程? (在RxAndroid中它看起来像.observeOn(AndroidSchedulers.mainThread()))我看到toBlocking()。[first,last,...]还有什么? – YNChumak 2015-03-21 04:14:13