首页 > 解决方案 > eclipse 作业在加入后挂起 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?谢谢你。

标签: javaeclipsejobsrcp

解决方案


不要那样打电话join。您正在安排作业,然后立即等待它完成,这将阻塞 UI,直到作业结束。

您可以将代码添加到done作业更改侦听器的方法中,以便在作业完成时进行处理。

所以像:

job.addJobChangeListener(new JobChangeAdapter()
   {
     @Override
     public void done(IJobChangeEvent event)
     {
       // TODO Your work here
     }
   });

job.schedule();

我在JobChangeAdapter这里使用而不是IJobChangeListener直接使用,因为它提供了您不需要使用的方法的默认实现。

另一种方法是在代码中使用Display.asyncExecJobUI 线程中运行一些代码。


推荐阅读