2017-03-07 10 views
0

私は1日このままで立ち往生してきました。 Dan Lew great postに触発され、私はrepeatWhenのための簡単なテストケースを(作ってみました)とretryWhen():RxJava:なぜretryWhen/repeatWhenが動作しないのですか?

public class ObsTest { 

    private static final Logger LOG = LoggerFactory.getLogger(ObsTest.class); 

    @Test 
    public void test1() throws InterruptedException { 

    Observable<Integer> obs = rx.Observable.<Integer> create(observer -> { 
    LOG.info("onSubscribe"); 
    Integer data = RandomUtils.nextInt(0, 1000); 
    if (data % 2 != 0) { 
     observer.onError(new RuntimeException("Odd number " + data)); 
    } else { 
     observer.onNext(data); 
    } 
    observer.onCompleted(); 
    }, BackpressureMode.BUFFER); 

    obs.repeatWhen(completed -> completed.delay(1, TimeUnit.MILLISECONDS)) 
     .retryWhen(error -> error.delay(1, TimeUnit.MILLISECONDS)) 
    .subscribe(i -> LOG.info("value={}", i), e -> LOG.info("Exception = {}", e.getMessage())); 

}

私の考えでは、これが永遠に実行する必要があり、「正しい」結果として偶数を放出し、奇数は「エラー」とみなされます。 代わりに、これは1つまたは2つのループに対して実行され、その後停止します。そして、それは、遅延が1ミリ秒で、より長い時間(すなわち、1秒)、1回だけ実行され、ちょうど1つの奇数または偶数を発する。 私は何か間違っていると確信していますが、私はそれが何かを見つけることができません。

答えて

2

Schedulers.computation()を使用するdelayに電話すると、非同期性が導入されます。バックグラウンドスレッドでアクティビティが発生すると、テストは終了し、おそらくプロセスが終了します。 blockingSubscribeを使用するか、最後に長めのThread.sleepを入れる必要があります。

関連する問題