【问题标题】:Eclipse job with UI access具有 UI 访问权限的 Eclipse 作业
【发布时间】:2016-12-28 02:01:45
【问题描述】:

我有一种情况。 我有一个 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 的东西,而我的方法是尝试访问实际上位于该作业progressmonitor 后面的UI。由于进度监视器没有 ActiveWorkbenchWindow,它会给出 NullPointerException。

我不能使用 UIJob,因为我必须异步执行这个 methodForExecution()。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: eclipse eclipse-plugin eclipse-rcp jobs


    【解决方案1】:

    您要运行的代码必须在 UI 主题中运行。

    如果作业中的大部分工作是更新 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

    【讨论】:

    • 我在使用 UIJob 时遇到了这个stackoverflow.com/questions/19325603/… 问题
    • 如果您所做的只是显示视图,那么工作将很快完成,并且没有时间显示进度条
    • 我已经更新了答案,以便更明确地说明何时使用 UIJob 或普通 Job。
    • 是的,所以情况是 - 大量非 UI 长时间运行的代码和大量 UI 代码。所以,如果我使用 UIJob,进度监视器不会显示,如果我使用 worker Job ,由于太多可运行文件,可能会出现溢出。
    • 您可以使用syncExec 代替asyncExec 等待UI 更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2017-10-08
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-07-24
    • 2023-03-25
    相关资源
    最近更新 更多