затмение работа висит пользовательский интерфейс после присоединения - PullRequest
0 голосов
/ 21 сентября 2019

У меня такая ситуация, когда копирование элементов завершено, он должен изменить пользовательский интерфейс.Я создал задание для копирования элементов и присоединился к заданию, чтобы до его завершения он не изменял пользовательский интерфейс.Но пользовательский интерфейс зависает до завершения операции копирования.Вот мой код

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 Ответ

0 голосов
/ 21 сентября 2019

Не звоните join так.Вы планируете задание, а затем сразу же ожидаете его завершения, что блокирует пользовательский интерфейс до завершения задания.

Вы можете добавить код в метод done прослушивателя смены задания, чтобы выполнять обработку при выполнении заданиязакончил.

Так что-то вроде:

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

job.schedule();

Я использовал JobChangeAdapter здесь, а не IJobChangeListener напрямую, поскольку он обеспечивает реализации по умолчанию методов, которые вам не нужны.

Альтернативой является использование Display.asyncExec в коде Job для запуска некоторого кода в потоке пользовательского интерфейса.

...