加入后 eclipse 作业挂起 ui
eclipse job hanging ui after join
我有这样的情况,一旦项目复制完成,它必须更改 ui。我创建了一个作业来复制项目并加入作业,以便在完成之前不会修改 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
,因为它提供了您不需要使用的方法的默认实现。
另一种方法是在 Job
代码中使用 Display.asyncExec
到 UI 线程中的某些代码 运行。
我有这样的情况,一旦项目复制完成,它必须更改 ui。我创建了一个作业来复制项目并加入作业,以便在完成之前不会修改 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
,因为它提供了您不需要使用的方法的默认实现。
另一种方法是在 Job
代码中使用 Display.asyncExec
到 UI 线程中的某些代码 运行。