android - 何时使用 doOnTerminate 与 doOnUnsubscribe?

标签 android rx-java rx-android

当有东西订阅了我的 Observable 时,我需要得到通知。我还需要得到通知,即 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 之前被调用?如果我只想知道事情已经“完成”,那么我选择哪个真的很重要吗?

最佳答案

在您的 react 流中取消订阅的方式将决定您可以使用 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。当您拥有无限运行的源或像用户点击可观察到的热源时,发生这种情况的可能性会更大。

下面的例子只会打印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

关于android - 何时使用 doOnTerminate 与 doOnUnsubscribe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407842/

相关文章:

rx-java - RxKotlin (RxJava2) timeout() 不会抛出 TimeoutException

android - 使用Retrofit +RxJava在请求之间传输数据

java - Glide v4 中的差异 DiskCacheStrategy

android - 我需要放慢 espresso 测试用例的运行速度

java - 在 RxJava 中重试异步操作链的内置或推荐方法

java - Android RX Java 2 一次性

java - 使用 InstanceID 和 ReactiveX 的 IOException (MAIN_THREAD)

java - 增加不透明度,想要恒定的不透明度 Image View with Drawable

Android:带背景的透明彩色ListView

android - Rxjava + 从不正确的线程访问 Realm