2015-03-19 204 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