【问题标题】:eclipse job hanging ui after joineclipse 作业在加入后挂起 ui
【发布时间】:2020-01-22 03:47:33
【问题描述】:

我有这样的情况,一旦项目的复制完成,它必须更改用户界面。我创建了一个作业来复制项目并加入作业,这样在完成之前它不会修改用户界面。但是 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? 谢谢。

【问题讨论】:

    标签: java eclipse jobs rcp


    【解决方案1】:

    不要这样打电话给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 的颜色。如果我在 done(event) 中调用 ui 方法,它不会改变颜色。如果我之后打电话,它会再次挂起。 @greg-449
    • 不保证作业更改侦听器在 UI 线程中运行。如果要更新 UI 对象,则需要在 done 方法中使用 Display.asyncExec。您是否检查过done 方法实际上正在运行?我不知道你所说的“打电话”是什么意思?
    • 是的,你是对的!我在 done 方法中直接调用,忘记添加 Display.asyncExec ......谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多