作业完成后更新 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();
}
});
}
});
在安排作业之前添加侦听器。
我有一个很长的 运行 进程从数据库中检索记录,我不希望 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();
}
});
}
});
在安排作业之前添加侦听器。