何时使用doOnTerminate vs doOnUnsubscribe?

tir*_*r38 6 android rx-java rx-android

当需要订阅我的observable时,我需要得到通知.我还需要通知观察者有错误或已完成.所以我认为我应该使用doOnSubscribe:

注册观察者订阅Observable时要采取的行动

并且doOnTerminate:

在Observable成功完成或出错时注册要执行的操作

然后我看到doOnUnsubscribe:

注册观察者取消订阅Observable时要采取的行动

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

那么,doOnTerminate以前总会被叫到doOnUnsubscribe吗?如果我只是想知道事情是"完成的",那我选择哪个真的很重要?

Pra*_*pta 14

该方法退订发生在你的反应流将决定哪一个从doOnUnsubscribedoOnTerminate可以使用.以下是可能的情况:

可观察的完成/错误触发器取消订阅
在这种情况下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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)