2016-11-03 11 views
3

私が観察可能なものを購読したときに通知を受ける必要があります。私はまた、私の観察可能性がエラーを起こしたか完了したという通知を受ける必要があります。だから私は、私はdoOnSubscribeを実装する必要があります考えた:doOnTerminateとdoOnUnsubscribeのどちらを使用するのですか?

観察者が 観察可能

doOnTerminateに加入したときに実行するアクションを登録します。

たときに観察可能に実行するアクションを登録します完了しました 成功またはエラーあり

は、その後、私はdoOnUnsubscribeを見た:

観察可能

からときオブザーバーの登録解除を実行するアクションを登録し、doOnSubscribe/doOnUnsubscribeの対称性が良いだろうと思いました。

doOnUnsubscribeの前には、常にdoOnTerminateが呼び出されますか?物事が「完了」していることを知りたいのであれば、それは本当に重要なのですか?

+0

DoOnTerminalの定義は次のとおりです。 "OnCompletedまたはonErrorを呼び出すときにアクションを呼び出すように、Observableソースを変更します。" doOnUnsubscribeとはまったく異なります。もしあなたが購読を中止した熱心なオブザーバブルの購読をしていれば、doOnUnsubscribeコールが得られ、オブザーバブルは値を生成し続けます。 observableが 'done'(onComplete、onError)かどうかを通知する場合は、doOnTerminateを使用します。成功の完了を知りたければ、doOnCompletedを使用します。 –

答えて

8

あなたのリアクティブフローでの購読解除の方法によって、doOnUnsubscribeまたはdoOnTerminateのいずれかが使用されます。以下は、ケースとすることができる:

観測完了/エラーがdoOnTerminatedoOnUnsubscribe両方がdoOnTerminateが最初に呼び出されると呼び出されるようなシナリオでは
解除をトリガします。

以下の例では、で終了し、は非公開の両方を出力します。観察可能なだけdoOnUnsubscribeが呼び出されるようなシナリオで
を完了する前に退会する

Subscription subscribe = Observable.empty() // source terminates immediately 
    .subscribeOn(Schedulers.newThread()) 
    .doOnTerminate(() -> System.out.println("terminated")) 
    .doOnUnsubscribe(() -> System.out.println("unsubscribed")) 
    .subscribe(); 

TimeUnit.SECONDS.sleep(1); 
subscribe.unsubscribe(); // by this time already unsubscribe would have happened 

プログラムによるコール。無限に実行されるソースや、ユーザーのクリックに対して観測可能なようなソースがある場合、この問題の可能性はより一般的です。

以下の例では、のサブスクライブされていないのみが出力されます。

Subscription subscribe = Observable.never() // source never terminates 
    .subscribeOn(Schedulers.newThread()) 
    .doOnTerminate(() -> System.out.println("terminated")) 
    .doOnUnsubscribe(() -> System.out.println("unsubscribed")) 
    .subscribe(); 

TimeUnit.SECONDS.sleep(1); 
subscribe.unsubscribe(); // this will trigger unsubscribe 
+0

素晴らしい!ありがとう。 – tir38

+0

偉大な答え!多くの助けになります。ご挨拶 –

関連する問題