2016-01-02 64 views
2

我是新來的RX,我不知道調度程序是如何工作的。以下是一些永不運行的代碼onComplete。但如果我把while(true)循環結束它工作正常。它會在運行new thread之前關閉應用程序。Rxjava時間表不會在最後一行後運行

爲什麼會發生這種情況?以及如何解決這個問題?

Subscriber<String> subscriber = new Subscriber<String>() { 
     @Override 
     public void onCompleted() { 
      System.out.println("done"); 
     } 

     @Override 
     public void onError(Throwable throwable) { 

     } 

     @Override 
     public void onNext(String o) { 
      System.out.println(o); 
     } 
    }; 

    Observable.from(new String[]{"1", "2", "3","4"}). 
      subscribeOn(Schedulers.immediate()) 
      .observeOn(Schedulers.newThread()) 
      .subscribe(subscriber); 

回答

3

如果您的程序過早退出,只需添加Thread.sleep(1000);作爲最後一條語句。

至於爲什麼發生這種情況。

This answer報價:

Java虛擬機繼續直至出現以下任何一種情況發生時執行線程:

...

所有線程都沒有守護線程已經死了.. 。

現在,如果我們看RxThreadFactory產生線程爲Schedulers

public final class RxThreadFactory extends AtomicLong implements ThreadFactory { 

    ... 

    @Override 
    public Thread newThread(Runnable r) { 
     Thread t = new Thread(r, prefix + incrementAndGet()); 
     t.setDaemon(true); 
     return t; 
    } 
} 

所以一個更復雜的解決方案是使用Schedulers.from()和自定義Executor通過用自己的ThreadFactory產生非守護線程。

+0

謝謝!但不尋找只是一個工作解決方案。尋找正確的方式。如果'newThread'需要5秒鐘怎麼辦? – sajad

+0

@sajad我已經擴展了我的答案 – AndroidEx

相關問題