java - eclipse 作业在加入后挂起 ui
问题描述
我有这样的情况,一旦完成项目的复制,就必须更改用户界面。我创建了一个工作来复制项目并加入工作,这样在完成之前它不会修改用户界面。但是 ui 会挂起,直到复制操作完成。这是我的代码
private void copyItems(SelectDTO selection, TreeViewer viewer) {
try {
Job job = new Job("test") {
@Override
protected IStatus run(IProgressMonitor monitor) {
ISafeRunnable runnable = new ISafeRunnable() {
@Override
public void run() throws Exception {
//copy items
}
@Override
public void handleException(Throwable exception) {
}
};
SafeRunner.run(runnable);
return Status.OK_STATUS;
}
@Override
public boolean belongsTo(Object family) {
}
};
我加入了 addJobChangeListener 的工作
job.addJobChangeListener(new IJobChangeListener() {
@Override
public void sleeping(IJobChangeEvent event) {
// TODO Auto-generated method stub
}
@Override
public void scheduled(IJobChangeEvent event) {
// TODO Auto-generated method stub
}
@Override
public void running(IJobChangeEvent event) {
// TODO Auto-generated method stub
}
@Override
public void done(IJobChangeEvent event) {
}
@Override
public void awake(IJobChangeEvent event) {
// TODO Auto-generated method stub
}
@Override
public void aboutToRun(IJobChangeEvent event) {
// TODO Auto-generated method stub
}
});
job.schedule();
job.join();
} catch (Exception e) {
}
}
调用此方法后,我正在更新 ui。我可以做些什么来停止挂起ui?谢谢你。
解决方案
不要那样打电话join
。您正在安排作业,然后立即等待它完成,这将阻塞 UI,直到作业结束。
您可以将代码添加到done
作业更改侦听器的方法中,以便在作业完成时进行处理。
所以像:
job.addJobChangeListener(new JobChangeAdapter()
{
@Override
public void done(IJobChangeEvent event)
{
// TODO Your work here
}
});
job.schedule();
我在JobChangeAdapter
这里使用而不是IJobChangeListener
直接使用,因为它提供了您不需要使用的方法的默认实现。
另一种方法是在代码中使用Display.asyncExec
在Job
UI 线程中运行一些代码。
推荐阅读
- reactjs - Mapbox 光栅图像在移动设备中不起作用
- java - 小心使用方法的警告
- javascript - jest.doMock 和 JSON 导入模拟
- java - 将其认知复杂度从 59 降低到允许的 15
- maven - Quarkus:maven部署runner jar
- android - Android Firefox-debug per USB, Inspector 什么也没显示
- c# - C# Entity Framework MySQL 使用 SRID 4326 注册空间数据
- angular - 我们如何根据角度反应形式的数据库中的值将动态复选框设置为检查?
- angular - 如何电子 main.ts 调用或发送消息到角度组件
- android - 在同一个对话框中同时询问多个权限