返回在runSync方法中创建的对象的值

时间:2017-11-20 14:17:10

标签: java eclipse eclipse-plugin eclipse-rcp

我有一个扩展MessageConsole类的类,它需要一个超级构造函数super(String name, ImageDescriptor imgDescriptor)的实例。用于创建ImageDescriptor的方法如下:

ImageDescriptor.createFromImage(Activator.getImage(SharedImages.SPECIFIC_IMAGE));

此方法随机导致org.eclipse.swt.SWTError: Invalid thread access,因为在调用它时,工作台可能会也可能不会启动。

我读here我需要在syncasync模式下运行该功能才能在UI上正确执行操作,因此我创建了以下方法:

private static ImageDescriptor createImageDescriptor() {
    Activator.getMyService().runSync(new Runnable() {

        public void run() {
           ImageDescriptor.createFromImage(Activator.getImage(SharedImages.JUSTIFICATION));
        }
    });

    return null;
}

runSyncsyncExec的包装,在调用它之前会添加一些检查。您可以考虑syncExec而不是runSync 我怎样才能返回创建的ImageDescriptor的值,以便将其传递给super构造函数?

1 个答案:

答案 0 :(得分:1)

MessageConsole的其他部分也可能在UI线程中运行:

  • 只有实例化并使用扩展类设计才能在UI线程中使用的类,如MessageConsole只有如果确实如此需要(例如,使用延迟加载;对于单身人士,您可以使用initialization-on-demand holder idiom)。
  • 如果在非UI线程中需要该类,包装所有内容,则通过new ...和方法调用实例化,需要在{i}中的UI线程中调用{3}} 即可。