何时使用 doOnTerminate 与 doOnUnsubscribe?

2024-03-09

当有人订阅我的可观察对象时,我需要收到通知。我还需要收到通知,可观察对象已出错或已完成。所以我想我应该使用doOnSubscribe:

注册观察者订阅时要采取的操作 可观察的

and doOnTerminate:

注册一个 Observable 完成时要采取的操作,或者 成功或有错误

然后我看到doOnUnsubscribe:

注册观察者取消订阅时要采取的操作 可观察的

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

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


取消订阅在反应流中发生的方式将决定来自哪一个doOnUnsubscribe or doOnTerminate您可以使用。可能有以下几种情况:

可观察的完成/错误触发取消订阅
在这种情况下,双方doOnTerminate and doOnUnsubscribe将被调用doOnTerminate首先被呼叫。

下面的示例将打印两者终止 and 取消订阅.

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 doOnTerminate 与 doOnUnsubscribe? 的相关文章

随机推荐