我有一些从SWT
Composite
派生的类的实例。
这些实例被注入ContextInjectionFactory
。该类的一个示例是:
public class MyTest extends Composite {
public MyTest(Composite parent, int style) {
super(parent, style);
}
@Inject
@Optional
private void doSomething(@UIEventTopic(EventConstants.TEST) Object unused) {
//do something
}
}
这就是我的用法:
public createTestContent() {
MyTest myTest = new MyTest(composite, SWT.NONE);
ContextInjectionFactory.inject(myTest, context);
}
public someAction() {
composite.dispose();
}
如果现在(通过处置其父项)处置这些对象,我希望示例代码中的doSomething方法不再被调用。但是实际上它仍然会被调用。
为了阻止此行为,我需要致电
ContextInjectionFactory.uninject(myTest, context);
有人知道为什么会这样吗?
最佳答案
当您使用@UIEventTopic
时,Eclipse必须记住该方法,以便在事件发生时可以调用该方法。 Eclipse会继续记住并调用此方法,直到您在类实例上运行ContextInjectionFactory.uninject
为止。
这与处理SWT控件无关-只是释放控件正在使用的所有本机数据。
看起来与ExtendedObjectSupplier
进行处理的@UIEventTopic
使用WeakReference
来记住方法信息,因此有时在内存不足时可能会丢弃数据。