我遇到这样的情况,一旦项目复制完成,它就必须更改用户界面。我创建了一个作业来复制项目并加入作业,以便在其完成之前不会修改用户界面。但 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) { }}调用此方法后,我正在更新用户界面。我可以做哪些改变来停止用户界面的挂起?谢谢。
1 回答
BIG阳
TA贡献1859条经验 获得超6个赞
别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 线程中运行某些代码。
添加回答
举报
0/150
提交
取消