何时使用doOnTerminate vs doOnUnsubscribe?

时间:2016-11-03 17:31:51

标签: android rx-java rx-android

我需要在订阅我的observable时收到通知。我还需要通知观察者有错误或已完成。所以我认为我应该使用doOnSubscribe

  

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

doOnTerminate

  

注册Observable完成时要执行的操作   成功或有错误

然后我看到doOnUnsubscribe

  

注册观察者取消订阅时要执行的操作   可观察到的

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

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

1 个答案:

答案 0 :(得分:13)

在您的被动流程中取消订阅的方式将决定您可以使用doOnUnsubscribedoOnTerminate中的哪一个。以下是可能的情况:

可观察的完成/错误触发取消订阅
在这种情况下,doOnTerminatedoOnUnsubscribe将被调用,首先调用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