我有一个扩展MessageConsole
类的类,它需要一个超级构造函数super(String name, ImageDescriptor imgDescriptor)
的实例。用于创建ImageDescriptor
的方法如下:
ImageDescriptor.createFromImage(Activator.getImage(SharedImages.SPECIFIC_IMAGE));
此方法随机导致org.eclipse.swt.SWTError: Invalid thread access
,因为在调用它时,工作台可能会也可能不会启动。
我读here我需要在sync
或async
模式下运行该功能才能在UI上正确执行操作,因此我创建了以下方法:
private static ImageDescriptor createImageDescriptor() {
Activator.getMyService().runSync(new Runnable() {
public void run() {
ImageDescriptor.createFromImage(Activator.getImage(SharedImages.JUSTIFICATION));
}
});
return null;
}
runSync
是syncExec
的包装,在调用它之前会添加一些检查。您可以考虑syncExec
而不是runSync
我怎样才能返回创建的ImageDescriptor
的值,以便将其传递给super
构造函数?
答案 0 :(得分:1)
MessageConsole
的其他部分也可能在UI线程中运行:
MessageConsole
只有如果确实如此需要(例如,使用延迟加载;对于单身人士,您可以使用initialization-on-demand holder idiom)。new ...
和方法调用实例化,需要在{i}中的UI线程中调用{3}} 即可。