当某些内容订阅了我的可观察对象时,需要通知我。我还需要通知可观察对象已错误或已完成。所以我认为我应该使用doOnSubscribe:



doOnTerminate:



然后我看到了doOnUnsubscribe:



并认为doOnSubscribe/doOnUnsubscribe的对称性会更好。

那么,doOnTerminate总是会在doOnUnsubscribe之前被调用吗?如果我只想知道事情已经“完成”,那么选择哪一个真的很重要吗?

最佳答案

响应流中退订的发生方式将确定您可以使用doOnUnsubscribe还是doOnTerminate中的哪一种。可能是以下情况:

可观察的完成/错误触发取消订阅
在这种情况下,将首先调用doOnTerminate来调用doOnUnsubscribedoOnTerminate

下面的示例将同时打印终止和取消订阅。

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/

10-09 00:52