2017-01-27 6 views
1

AIM:何かが変更されたときに、ユーザーがリストをスクロールしなくても、アダプタを更新します。doOnNext内にスローされたRxJavaの再試行

doOnNextにエラーをスローして、もう一度やり直すことができます。しかし、これは動作していません。私は例外がスローされていることがわかりますが、retryWhenは何もしていないようです。

私はここで間違っていますか?

someObservable() 
    .observeOn(AndroidSchedulers.mainThread()) 
    .debounce(650, TimeUnit.MILLISECONDS) 
    .doOnNext(o -> { 
     if (isListScrolling()) { 
     throw new IllegalStateException(); 
     } 
    }) 
    .retryWhen(errors -> errors.flatMap(error -> Observable.timer(100, TimeUnit.MILLISECONDS))) 
    .subscribe(o -> refreshListNow()); 

UPDATEsomeObservableSubject(バス)である私は、上のUIイベントを観察しています。

retry()と思われるので、ここで私のコメントを見てください。おそらくBehaviorSubject - isnを使用していない限り、再試行でソースが自動的に最後の値を再発光しません。ここには適していない)。

答えて

0

あなたは値がemmitedであることは言及していません。だから私はこの例の文字列にします。 doOnNext内のスクロール状態をチェックするのは、retryWhenに戻すことができないため、遅すぎます。 flatMapを使用するだけで、代わりにエラーをスローすることができます。

+0

私は上記の亜種を試しましたが、エラーがなくても 'retryWhen'のコードが起動していると思われ、完全に終了したようです。 – strangetimes

+0

私は、 'observable'がSubject(バス)であると付け加えるべきでしょう。 – strangetimes

+0

2つのマイナーなこと - Observable.just(null) 'はRxJava 2では動作しません。' .flatMap'の代わりに '.map'を使用します。 「RxRelayのプロジェクトページ」(https://github.com/JakeWharton/RxRelay)を引用すると、件名が変更される可能性があります。「被験者は非Rx API間のギャップを埋めるのに便利ですが、彼らはonCompleteまたはonErrorを受け取ったときにも、データの移動には使用できなくなります。これは観測可能な契約であり、時にはそれが望ましい動作です。 – ahmedre

関連する問題