我正在执行一个长时间运行的操作并显示消息对话框"获取详细信息"并且一旦执行操作就关闭它。
try{
MessageDialog dialog = new MessageDialog(Display.getDefault().getActiveShell(), "Information", null, "Fetching Details...", MessageDialog.NONE , new String[] {}, -1);
dialog.setBlockOnOpen(false);
dialog.open();
//Schedule long Running operations
} finally{
dialog.close()
}
如果操作需要更多时间,则对话框显示无响应(标题更改为"信息(无响应)")。
如何避免无响应状态?
答案 0 :(得分:2)
您不能在UI线程中运行长操作。这样做会阻塞线程,直到完成并且UI将无响应。
在后台线程,Eclipse作业甚至Java 8 CompleteableFuture中运行您的操作。
使用后台代码中的Display
asyncExec
根据需要更新用户界面。
另一种方法是使用ProgressMonitorDialog
:
ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
try {
dialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
monitor.beginTask("Task name", IProgressMonitor.UNKNOWN);
try {
// TODO your long running code
// TODO check monitor.isCanceled() as often as possible
}
finally {
monitor.done();
}
}
});
}
... catch exceptions