我希望向用户显示一个简单的进度监视器对话框,同时在应用程序的本地数据库中搜索一些数据并显示在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);
}
}
答案 0 :(得分:0)
对于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)
的调用意味着如果作业在几秒钟内没有完成,则作业将显示进度对话框。