加入后 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) {


    }

}

调用此方法后,我正在更新用户界面。我可以做哪些改变来停止用户界面的挂起?谢谢。


慕姐8265434
浏览 90回答 1
1回答

BIG阳

别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 线程中运行某些代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java