为了账号安全,请及时绑定邮箱和手机立即绑定

加入后 Eclipse 作业挂起 ui

加入后 Eclipse 作业挂起 ui

慕姐8265434 2023-08-16 10:19:57
我遇到这样的情况,一旦项目复制完成,它就必须更改用户界面。我创建了一个作业来复制项目并加入作业,以便在其完成之前不会修改用户界面。但 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 线程中运行某些代码。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信