何时使用 doOnTerminate 与 doOnUnsubscribe?
When to use doOnTerminate vs doOnUnsubscribe?
当有东西订阅了我的可观察对象时,我需要得到通知。我还需要得到通知,即 observable 已出错或已完成。所以我想我应该使用 doOnSubscribe
:
register an action to take when an observer subscribes to an
Observable
和doOnTerminate
:
register an action to take when an Observable completes, either
successfully or with an error
然后我看到了doOnUnsubscribe
:
register an action to take when an observer unsubscribes from an
Observable
并认为 doOnSubscribe
/doOnUnsubscribe
的对称性会更好。
那么,doOnTerminate
总是会在 doOnUnsubscribe
之前被调用吗?如果我只想知道事情是 "done",我选择哪个真的很重要吗?
反应流中取消订阅的方式将决定您可以使用 doOnUnsubscribe
或 doOnTerminate
中的哪一个。可以是以下情况:
Observable completion/error 触发取消订阅
在这种情况下,doOnTerminate
和 doOnUnsubscribe
都将被调用,而 doOnTerminate
首先被调用。
下面的示例将打印 terminated 和 unsubscribed.
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
在 Observable 完成之前取消订阅的编程调用
在这种情况下,只会调用 doOnUnsubscribe
。当您拥有无限运行的源或像用户点击可观察到的热源时,发生这种情况的可能性更大。
下面的例子只会打印unsubscribed.
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
当有东西订阅了我的可观察对象时,我需要得到通知。我还需要得到通知,即 observable 已出错或已完成。所以我想我应该使用 doOnSubscribe
:
register an action to take when an observer subscribes to an Observable
和doOnTerminate
:
register an action to take when an Observable completes, either successfully or with an error
然后我看到了doOnUnsubscribe
:
register an action to take when an observer unsubscribes from an Observable
并认为 doOnSubscribe
/doOnUnsubscribe
的对称性会更好。
那么,doOnTerminate
总是会在 doOnUnsubscribe
之前被调用吗?如果我只想知道事情是 "done",我选择哪个真的很重要吗?
反应流中取消订阅的方式将决定您可以使用 doOnUnsubscribe
或 doOnTerminate
中的哪一个。可以是以下情况:
Observable completion/error 触发取消订阅
在这种情况下,doOnTerminate
和 doOnUnsubscribe
都将被调用,而 doOnTerminate
首先被调用。
下面的示例将打印 terminated 和 unsubscribed.
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
在 Observable 完成之前取消订阅的编程调用
在这种情况下,只会调用 doOnUnsubscribe
。当您拥有无限运行的源或像用户点击可观察到的热源时,发生这种情况的可能性更大。
下面的例子只会打印unsubscribed.
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