RxJava-我什么时候应该关注取消订阅?
RxJava- When should I be concerned with unsubscribing?
我想确保在使用 RxJava 时不会造成任何内存泄漏。请让我知道这些是否是处理每种情况的正确方法...
案例 1
如果我在同一范围内创建一个 Observable
和一个 Subscription
,GC 会处理它们,对吗?我必须在这里打电话给 unsubscribe()
吗?
public static void createObservableAndSubscribe() {
Observable<Integer> source = Observable.just(1,6,3,2,562,4,6);
Subscription sub = source.subscribe(i -> System.out.println(i));
sub.unsubscribe(); //unnecessary I assume? GC should take care of it?
}
案例 2
但是无限可观察对象和临时订阅者呢?假设我有一个订阅无限 Observable
的 GUI。但是当 GUI 被破坏时,我是否必须明确取消订阅 Subscriber
?
public void attachSubscriber(Observable<Integer> infiniteObservable) {
Subscription sub = infiniteObservable.subscribe(i -> countLabel.setText(i.toString());
//do stuff, have this subscription persist for the life of a GUI
sub.unsubscribe(); //must I do this when the GUI is destroyed?
}
案例一:
源是一个同步的有限 Observable,因此流将完成并自行取消订阅(SafeSubscriber
通过 subscribe
方法插入到调用链中,并将在终止时调用 unsubscribe
(错误或完成))。请注意,同步 sub
在流完成之前不会分配!
案例二:
我建议您确保在这种情况下调用 unsubscribe
以停止 activity 并释放其资源。请注意,一种同时适用于同步和异步源的更灵活的模式是预先设置 Subscriber
而不是依赖 subscribe
方法中的 return:
Subscriber<Integer> subscriber = Subscribers.from(i-> {countLabel.setText(i.toString);});
infiniteObservable.subscribe(subscriber);
现在,如果您从订阅 observable 的线程以外的线程调用 subscriber.unsubscribe()
,那么即使 observable 是同步源,它也会停止。
我想确保在使用 RxJava 时不会造成任何内存泄漏。请让我知道这些是否是处理每种情况的正确方法...
案例 1
如果我在同一范围内创建一个 Observable
和一个 Subscription
,GC 会处理它们,对吗?我必须在这里打电话给 unsubscribe()
吗?
public static void createObservableAndSubscribe() {
Observable<Integer> source = Observable.just(1,6,3,2,562,4,6);
Subscription sub = source.subscribe(i -> System.out.println(i));
sub.unsubscribe(); //unnecessary I assume? GC should take care of it?
}
案例 2
但是无限可观察对象和临时订阅者呢?假设我有一个订阅无限 Observable
的 GUI。但是当 GUI 被破坏时,我是否必须明确取消订阅 Subscriber
?
public void attachSubscriber(Observable<Integer> infiniteObservable) {
Subscription sub = infiniteObservable.subscribe(i -> countLabel.setText(i.toString());
//do stuff, have this subscription persist for the life of a GUI
sub.unsubscribe(); //must I do this when the GUI is destroyed?
}
案例一:
源是一个同步的有限 Observable,因此流将完成并自行取消订阅(SafeSubscriber
通过 subscribe
方法插入到调用链中,并将在终止时调用 unsubscribe
(错误或完成))。请注意,同步 sub
在流完成之前不会分配!
案例二:
我建议您确保在这种情况下调用 unsubscribe
以停止 activity 并释放其资源。请注意,一种同时适用于同步和异步源的更灵活的模式是预先设置 Subscriber
而不是依赖 subscribe
方法中的 return:
Subscriber<Integer> subscriber = Subscribers.from(i-> {countLabel.setText(i.toString);});
infiniteObservable.subscribe(subscriber);
现在,如果您从订阅 observable 的线程以外的线程调用 subscriber.unsubscribe()
,那么即使 observable 是同步源,它也会停止。