我有一种情况。 我有一个Eclipse作业,代码如下:
private class ExecutionJob extends Job {
public static final String MY_FAMILY = "myJobFamily";
public ExecutionJob(String name) {
super(name);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask("executing ...... ", IProgressMonitor.UNKNOWN);
methodForExecution();
monitor.done();
return Status.OK_STATUS;
}
@Override
public boolean belongsTo(Object family) {
return family == MY_FAMILY;
}
}
此methodForExecution()的代码如下:
public void methodForExecution(){
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("view_id");
}
现在,情况是,工作开启了类似progressmonitor的东西,而我的方法正试图访问实际上在这个工作的进度监视器后面的UI。并且它提供NullPointerException,因为进度监视器没有ActiveWorkbenchWindow。
我无法使用UIJob,因为我必须异步执行此methodForExecution()。 有人可以帮我解决这个问题。
答案 0 :(得分:2)
您要运行的代码必须在UI thead中运行。
如果作业中的大多数工作都在更新UI,并且没有长时间运行的非UI代码,那么您应该使用UIJob
来运行它。这仍然被安排为作业,但runInUIThread
方法在UI线程中执行。
如果您有很多非UI代码,尤其是长时间运行的代码,那么请使用普通Job
,但您必须使用Display.asyncExec
在UI线程中运行该方法:
Display.getDefault().asyncExec(new Runnable()
{
@Override
public void run()
{
methodForExecution();
}
});
在Java 8中你可以这样做:
Display.getDefault().asyncExec(this::methodForExecution);
您也可以使用syncExec
代替asyncExec
等待用户界面更新。
如果您只想showView
,则可以在不使用asyncExec
的情况下执行Job
。