我需要在订阅我的observable时收到通知。我还需要通知观察者有错误或已完成。所以我认为我应该使用doOnSubscribe
:
注册观察者订阅时要采取的行动 可观察到的
和doOnTerminate
:
注册Observable完成时要执行的操作 成功或有错误
然后我看到doOnUnsubscribe
:
注册观察者取消订阅时要执行的操作 可观察到的
并认为doOnSubscribe
/ doOnUnsubscribe
的对称性会更好。
那么,doOnTerminate
之前是否会始终调用doOnUnsubscribe
?如果我只是想知道事情已经“完成”,那我选择哪个真的很重要?
答案 0 :(得分:13)
在您的被动流程中取消订阅的方式将决定您可以使用doOnUnsubscribe
或doOnTerminate
中的哪一个。以下是可能的情况:
可观察的完成/错误触发取消订阅
在这种情况下,doOnTerminate
和doOnUnsubscribe
将被调用,首先调用doOnTerminate
。
以下示例将打印已终止和已取消订阅。
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
。当你拥有一个无限运行的源或一个像用户点击可观察的热源这样的源时,这种情况发生的可能性更大。
以下示例仅打印取消订阅。
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