2016-07-04 4 views

答えて

8

は、あなたが他のObservableとエラーから再開することができwant-どんなアイテム発することができます。

Observable<String> data = ... 
data.timeout(1, TimeUnit.SECONDS) 
    .onErrorResumeNext(Observable.empty()) 
    .subscribe(...); 
+0

これは、このコードが行うことです。それはあなたのエラーを即座に完了するObservableに変換します – dwursteisen

+1

それはあまりにもそれらをキャッチするので、エラーがさらに上流から来る可能性がある場合、この解決策は動作しないことに注目する価値がある... – forresthopkinsa

3

あなたは常にエラーになりますどの onErrorResumeNext を使用することができ、あなたが、たとえば、

/** 
* Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated 
*/ 
@Test 
public void observableOnErrorResumeNext() { 
    Subscription subscription = Observable.just(null) 
              .map(Object::toString) 
              .doOnError(failure -> System.out.println("Error:" + failure.getCause())) 
              .retryWhen(errors -> errors.doOnNext(o -> count++) 
                    .flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null)), 
                Schedulers.newThread()) 
              .onErrorResumeNext(t -> { 
               System.out.println("Error after all retries:" + t.getCause()); 
               return Observable.just("I save the world for extinction!"); 
              }) 
              .subscribe(s -> System.out.println(s)); 
    new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS); 
} 
+0

私はあなたが、onErrorResumenNextにあなたはそれがパイプラインを終えるであろうあなたの観測を放出するだろうonErrorを – pixel

+0

後のストリームを完了したいと思います。私が書いたテストを実行すると、あなたは理解するでしょう。より実用的な例をご覧になりたい方はこちらをご覧くださいhttps://github.com/politrons/reactive – paul

0

Observable.timeoutを使用しないより簡単な解決法(したがって、不要な例外をキャッチするリスクを伴わないエラーを生成しない)は、タイマーが完了するまでESは:

Observable<String> data = ... 
data.takeUntil(Observable.timer(1, TimeUnit.SECOND)) 
    .subscribe(...); 
関連する問題