当有东西订阅了我的 Observable 时,我需要得到通知。我还需要得到通知,即 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
之前被调用?如果我只想知道事情已经“完成”,那么我选择哪个真的很重要吗?
最佳答案
在您的 react 流中取消订阅的方式将决定您可以使用 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
。当您拥有无限运行的源或像用户点击可观察到的热源时,发生这种情况的可能性会更大。
下面的例子只会打印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
关于android - 何时使用 doOnTerminate 与 doOnUnsubscribe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407842/