Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回在runSync方法中创建的对象的值_Java_Eclipse_Eclipse Plugin_Eclipse Rcp - Fatal编程技术网

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

Java 返回在runSync方法中创建的对象的值,java,eclipse,eclipse-plugin,eclipse-rcp,Java,Eclipse,Eclipse Plugin,Eclipse Rcp,我有一个类扩展了MessageConsole类,该类需要它的超级构造函数的一个实例super(字符串名,ImageDescriptor imgDescriptor)。用于创建图像描述符的方法如下: ImageDescriptor.createFromImage(Activator.getImage(SharedImage.SPECIFIC_IMAGE)) 此方法随机导致org.eclipse.swt.swt错误:线程访问无效,因为在调用它时,工作台可能会启动,也可能不会启动 我了解到我需要在sy

我有一个类扩展了
MessageConsole
类,该类需要它的超级构造函数的一个实例
super(字符串名,ImageDescriptor imgDescriptor)
。用于创建
图像描述符的方法如下:

ImageDescriptor.createFromImage(Activator.getImage(SharedImage.SPECIFIC_IMAGE))

此方法随机导致
org.eclipse.swt.swt错误:线程访问无效
,因为在调用它时,工作台可能会启动,也可能不会启动

我了解到我需要在
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
的包装,它在调用它之前添加一些检查。您可以考虑<代码> SycExcRe>代码>而不是<代码> RunSyc> < /C>。
如何返回所创建的
ImageDescriptor
的值,以便将其传递给
super
构造函数?

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

  • 只有实例化并使用一个类,该类扩展了类设计以在UI线程中使用,如
    MessageConsole
    当且仅当确实需要时才使用(例如,使用延迟加载;对于单例,可以使用)
  • 如果类在非UI线程中是必需的,包装所有内容,则通过
    new…
    进行实例化,并调用需要在
    中的UI线程中调用的方法

我也不能在
run
方法中调用
super()?在这里,您可以看到扩展
MessageConsole
的类是如何使用的:@howlger哦,现在我明白了,您指的是扩展
MessageConsole
的类的构造函数当调用它时,应该在
UIThread
中调用它。由于实现的原因,类的实例被保存在一个
静态最终MyClass实例中
,我也有同样的问题,我以后无法从
UIThread
中访问该值。如果在UIThread中使用
MyClass
,则
静态最终MyClass实例不是一个好主意,因为它会杀死延迟加载模式,同时也因为UI资源。@howlger我知道,但目前我只是在维护项目,因此,不幸的是,我不能去重新发明轮子