我想确保在使用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?
}
答案 0 :(得分:5)
案例1:
源是同步的有限Observable,因此流将完成并取消订阅(SafeSubscriber
通过subscribe
方法插入到调用链中,并在终止时调用unsubscribe
(错误或完成))。请注意,在流完成之前,不会分配同步sub
!
案例2:
我建议您确保在这种情况下调用unsubscribe
来停止活动并释放其资源。请注意,适用于同步和异步源的更灵活的模式是事先设置Subscriber
而不依赖于subscribe
方法的返回:
Subscriber<Integer> subscriber = Subscribers.from(i-> {countLabel.setText(i.toString);});
infiniteObservable.subscribe(subscriber);
现在,如果从除了observable订阅的线程以外的线程调用subscriber.unsubscribe()
,那么即使observable是同步源,它也会停止。