何时使用 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",我选择哪个真的很重要吗?

反应流中取消订阅的方式将决定您可以使用 doOnUnsubscribedoOnTerminate 中的哪一个。可以是以下情况:

Observable completion/error 触发取消订阅
在这种情况下,doOnTerminatedoOnUnsubscribe 都将被调用,而 doOnTerminate 首先被调用。

下面的示例将打印 terminatedunsubscribed.

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