具有UI访问权限的Eclipse作业

时间:2016-12-27 09:06:26

标签: eclipse eclipse-plugin eclipse-rcp jobs

我有一种情况。 我有一个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()。 有人可以帮我解决这个问题。

1 个答案:

答案 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