android - 何时取消订阅

标签 android rx-java reactive-programming rx-android

我有一个关于如何取消订阅 observable 的问题。我有两个代码,我不确定哪个更好。

示例 1 -> 流结束后取消订阅订阅者:

Subscriber<String> subscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {
            progressdialog.dissmiss();
            unsubscribe();
        }

        @Override
        public void onError(Throwable e) {
            progressdialog.dissmiss();
        }

        @Override
        public void onNext(String s) {
            // do something with data
        }
    }

示例 2 -> Activity 销毁后取消订阅:

private void test(){
    Subscriber<String> subscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {
            progressdialog.dissmiss();
        }

        @Override
        public void onError(Throwable e) {
            progressdialog.dissmiss();
        }

        @Override
        public void onNext(String s) {
            // do something with data
        }
    };

    subscription = BackendRequest.login(loginRequest)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);

    compositeSubscription.add(subscription);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    this.subscription.unsubscribe();
}

我不得不提一下,我的 observables 只会发出一次,activity 不应该等待来自 Observable 的更多调用。

哪个更好?

提前致谢

最佳答案

从这两个选项中,第二个更好。

在您的第一个示例中,您在 onComplete() 方法中取消订阅,这是不需要的。如果您到达订阅的 onComplete(),则您不再有取消订阅的责任。

你的第二个例子是正确的。 CompositeSubscription 背后的想法是您可以向其中添加多个Subscriptions,然后一次清理(unsubscribe)。换句话说,这只是让您无需保留需要取消订阅的 Subscriptions 列表。

使用 CompositeSubscription 的一个棘手部分是,如果您曾经 unsubscribe 它,就可以 再次使用它。您可以查看 compositeSubscription.add() 的文档方法详细说明原因。简而言之 - 它会直接取消订阅您尝试添加的订阅。这是一个深思熟虑的决定(你可以阅读更多关于它的信息 HERE )。

回到您的示例,在 Activity 的 onDestroy() 中调用 unsubscribe() 很好,可以避免内存泄漏。关于您多次调用 test() 方法时出现问题的评论 - 我会说您的问题出在其他地方。也许您的用例不应该允许多次调用它,也许您应该在使用新收到的数据之前清理旧数据等。也许如果您详细解释了您面临的问题类型,我们可以提供更多帮助。但就 CompositeSubscription 而言 - 您正在使用它并正确取消订阅!

关于android - 何时取消订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756858/

相关文章:

android - 如何在 android 中使用 android-support-v4.jar 禁用 ViewPager 滑动

android - 如何在使用 addView 时设置 View 的位置

reactive-programming - ReactiveX 被认为是响应式(Reactive)编程吗?

ios - 如何在RxSwift中使用flatMap观察上层Observable?

java - 是否可以根据某些过滤器将内容从一个通量插入到另一个通量中

java - 如何使用 jsoup post 请求提交没有按钮名称的表单

java - 如何在 In FirestorePagingAdapter 中获取文档 ID?

android - RxJava中的特殊注释

java - RxJava just() 计算线程

java - 在 RxJava 中倒带一个 Observable?