当某些内容订阅了我的可观察对象时,需要通知我。我还需要通知可观察对象已错误或已完成。所以我认为我应该使用doOnSubscribe
:
和doOnTerminate
:
然后我看到了doOnUnsubscribe
:
并认为doOnSubscribe
/doOnUnsubscribe
的对称性会更好。
那么,doOnTerminate
总是会在doOnUnsubscribe
之前被调用吗?如果我只想知道事情已经“完成”,那么选择哪一个真的很重要吗?
最佳答案
响应流中退订的发生方式将确定您可以使用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
关于android - 何时使用doOnTerminate和doOnUnsubscribe?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40407842/