加入后 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 线程中的某些代码 运行。