我有一个关于如何取消订阅 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/