我遇到這樣的情況,一旦項目復制完成,它就必須更改用戶界面。我創建了一個作業來復制項目并加入作業,以便在其完成之前不會修改用戶界面。但 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
提交
取消