作业完成后更新 Eclipse RCP UI

Update Eclipse RCP UI after job is complete

我有一个很长的 运行 进程从数据库中检索记录,我不希望 UI 冻结。我已将实际检索移至作业。我如何知道作业何时完成以便我可以使用查询结果更新 UI?

在下面的示例代码中,一旦 dbJob 完成,我希望调用 updateUI 方法。

public void updateUI() {
    if (viewList.size() > 0) {
        ((StackLayout) compositeStacked.getLayout()).topControl = compositeTable;
    } else {
        ((StackLayout) compositeStacked.getLayout()).topControl = compositeNoRows;
    }
    compositeStacked.layout();

    // set input and refresh
    tableViewer.setInput(motorList);
    tableViewer.refresh();
}


public refresh() {
    Job dbJob = new Job("List Retrieve") {
        @Override
        protected IStatus run(IProgressMonitor monitor) {
            try {
                viewList = Databasequery
            } catch (BusinessException e) {
                StatusManager.getManager().handle(
                        new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Could not retrieve the list", e),
                        StatusManager.LOG | StatusManager.SHOW);
            } catch (Throwable t) {
                logger.warn("Error retrieving list", t);
            }
            return Status.OK_STATUS;
        }
    };

    dbJob.schedule();
}

使用 IJobChangeListener 来监听作业状态的变化。有一个标准 JobChangeAdapter class 为您不需要的方法提供默认值,因此您可以执行以下操作:

  dbJob.addJobChangeListener(new JobChangeAdapter() {
     @Override
     public void done(IJobChangeEvent event)
     {
       // Listener does not run in UI thread so use asyncExec

       Display.getDefault().asyncExec(new Runnable()
        {
          @Override
          public void run()
          {
            updateUI();
          }
        });
     }
   });

在安排作业之前添加侦听器