我有这样的事情。
Button button = new Button(parent, SWT.PUSH);
PublishSubject<Event> subject = PublishSubject.create();
button.addListener(SWT.Selection, e -> subject.onNext(e));
subject.subscribe(e -> System.out.println("selection=" + e));
如您所见,onCompleted()
永远不会被释放。如果我制作了一堆这些并失去了对它们的处理,它们就可以很好地收集垃圾了。
我决定是否应该添加这一行:
button.addListener(SWT.Dispose, e -> subject.onCompleted());
最好的我可以说,这只是添加了另一个需要GC编辑的匿名类,这似乎是一个糟糕的交易。我在考虑这个吗?发出onCompleted()
我失踪的任何好处?
答案 0 :(得分:1)
在这种情况下,我认为调用onCompleted
没有任何好处。如果你的observable使用了一些你需要处理的资源,一旦你完成了observable,那么我会说你应该传递一个终止事件或取消订阅。
如果您想在这些情况下保持安全,我通常会取消订阅您订阅的Subscriber
实例(创建一个并保留对它的引用,以便您可以调用subscriber.unsubscribe()
)。