RxJava-我什么时候应该关注取消订阅?

tmn*_*tmn 6 java reactive-programming rx-java

我想确保在使用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?
}
Run Code Online (Sandbox Code Playgroud)

案例2

但是无限的可观察和临时用户呢?假设我有一个订阅无限的GUI Observable.但是当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?
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ten 5

情况1:

源是一个同步的有限Observable,因此流将完成并取消订阅(SafeSubscriber通过该subscribe方法插入到调用链中并将调用unsubscribe终止(错误或完成)).请注意,sub在流完成之前不会分配同步!

案例2: 我建议您确保unsubscribe在这种情况下调用以停止活动并释放其资源.请注意,可以同时使用同步和异步源的更灵活的模式是Subscriber预先设置并且不依赖于subscribe方法的返回:

Subscriber<Integer> subscriber = Subscribers.from(i-> {countLabel.setText(i.toString);});
infiniteObservable.subscribe(subscriber);
Run Code Online (Sandbox Code Playgroud)

现在,如果subscriber.unsubscribe()从除了observable所订阅的线程之外的线程调用,那么即使observable是同步源,它也会停止.