2016-12-14 53 views
0

如何設置Observable的異步運算符在主線程中運行,而不是在另一個線程中運行。或者至少在我們完成後設置爲在主線程中獲得結果。訂閱主線程

@Test 
    public void retryWhen() { 
     Scheduler scheduler = Schedulers.newThread(); 
     Single.just("single") 
       .map(word -> null) 
       .map(Object::toString) 
       .retryWhen(ot -> 
         ot.doOnNext(t -> System.out.println("Retry mechanism:" + t)) 
           .filter(t -> t instanceof NullPointerException && cont < 5) 
           .flatMap(t -> Observable.timer(100, TimeUnit.MILLISECONDS,scheduler)) 
           .doOnNext(t -> cont++) 
           .switchIfEmpty(Observable.error(new NullPointerException()))) 
       .subscribeOn(scheduler) 
       .subscribe(System.out::println, System.out::println); 
//  new TestSubscriber() 
//    .awaitTerminalEvent(1000, TimeUnit.MILLISECONDS); 
    } 

我正在嘗試observerOn和subscribeOn,但都用於設置您想要執行的線程。但在我的情況下,我希望執行或結束它在我運行測試的同一線程中

現在,查看打印的唯一方法就是阻止並等待執行。

問候。

回答

1

您可以使用Observable.toBlocking()來獲得BlockingObservable並使用它在測試中提取結果。

+0

是的,但這只是阻塞,它幾乎等於另一個線程完成。我正在尋找的是一種方式來將發射的物品從另一個線程返回到主線程。我認爲這是我的選擇之一。無論如何謝謝 – paul

+0

你的'@ Test'方法結束之前,你需要'Observable'的結果嗎?除阻塞之外,我沒有看到另一種方法。 –

+0

測試它只是一個概念證明,以顯示我想要的東西。不用擔心,我相信我已經得到了它。我給你一個積極的幫助 – paul

0

如果不指定observeOn/subscribeOn並沒有操作員或觀察的變化線程,那麼當你subscribe以可觀察到的,也可以完成訂閱在所有的處理

+0

是的,但Observable.timer是異步運算符 – paul