Eclipse插件开发,长期运行任务
我有几个具有侦听器的UI组件。所有这些侦听器都调用方法Eclipse插件开发,长期运行任务,eclipse,plugins,asynchronous,code-injection,Eclipse,Plugins,Asynchronous,Code Injection,我有几个具有侦听器的UI组件。所有这些侦听器都调用方法dialogChanged()。我的目标是用这种方法进行一些长时间的处理,不要让UI冻结。据介绍,在运行时注入的ui同步的帮助下,可以做到这一点。但它对我来说失败了,这种类型的字段没有被注入,我得到了一个NullPointerException。以下是我代码的相关部分: @Inject UISynchronize sync; Job job = new Job("My Job") { @Override
dialogChanged()
。我的目标是用这种方法进行一些长时间的处理,不要让UI冻结。据介绍,在运行时注入的ui同步
的帮助下,可以做到这一点。但它对我来说失败了,这种类型的字段没有被注入,我得到了一个NullPointerException
。以下是我代码的相关部分:
@Inject UISynchronize sync;
Job job = new Job("My Job") {
@Override
protected IStatus run(IProgressMonitor arg0)
{
sync.asyncExec(new Runnable()
{
@Override
public void run()
{
updateStatus("Checking connection...");
if (bisInstallDirSelected)
bisSettingsChanged();
else
jarSettingsChanged();
}
});
return Status.OK_STATUS;
}
};
protected void dialogChanged()
{
job.schedule();
}
方法updateStatus(String s)
,bisSettingsChanged()
和jarsetingschanged()
与UI交互,具体来说,它们使用超类org.eclipse.jface.wizard.WizardPage的方法setErrorMessage(String newMessage)
如果有人能告诉我我做错了什么,或者提出更好的方法来处理这个问题,我将不胜感激。您只能在e4应用程序模型创建的类中使用@Inject(例如部件类或命令处理程序类)
您还可以使用ContextInjectionFactory
对自己的类进行注入
对于尚未完成注入的类,可以使用在UI线程中运行代码的“传统”方式:
Display.getDefault().asyncExec(可运行);
包含此代码的类是什么@Inject仅在应用程序模型知道的类(例如MPart的类)中工作。该类间接扩展了org.eclipse.jface.wizard.WizardPage
,并且没有其他依赖项。我已经尝试使用getShell().getDisplay().asyncExec()
,但在执行dialogChanged()时UI冻结
。这同样适用于您对静态方法的建议。我还使用Thread.currentMethod()
将运行runnable的线程与调用dialogChanged()
的线程进行了比较,结果发现它是同一个线程(main
)。它解释了UI冻结的原因,但我希望'asyncExec()'将处理交换到外部线程。等等。。。我想我理解我的错误:)我需要以某种方式将阻止处理的代码与与与UI交互的代码分开。。。