我想向用户显示一个简单的进度监视器对话框,同时在应用程序的本地数据库中搜索一些数据,并在UI中显示。
我目前使用ProgressMonitorDialog,其中我使用Display.getDefault().asyncExec
在UI线程中执行搜索。现在搜索非常慢。显示进度对话框、在数据库中执行搜索并在不损失性能的情况下向用户显示结果的正确线程用法是什么。
private void doSearchWithProgressDialog() {
ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(null);
try {
progressDialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
// display progress monitor dialog while searching
monitor.beginTask("Waiting..."), IProgressMonitor.UNKNOWN);
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
// perform database query
doSearchAndDisplayResult();
}
});
monitor.done();
}
});
}
catch (InvocationTargetException e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
}
catch (InterruptedException e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
}
}
对于 Eclipse 插件或 RCP 中长时间运行的代码,请使用 Job
:
class MyJob extends Job
{
public MyJob()
{
super("title");
setUser(true);
}
@Override
protected IStatus run(final IProgressMonitor monitor)
{
... your code
return Status.OK_STATUS;
}
}
与:
Job myJob = new MyJob();
myJob.schedule();
调用setUser(true)
意味着如果作业未在几秒钟内完成,则作业将显示进度对话框。