2015-09-02 8 views
0

У меня есть диспетчер, который имеет задание, созданное внутри метода widgetDisposed (DisposeEvent event). Таким образом, выполнение этого метода при удалении TreeViewer вызывает внутреннюю ошибку во время: «Работа по очистке». Нет контекста, доступного вне жизненного цикла службы запроса. Этот код используется как RCP, так и RAP, отлично работает на RCP app.Issue с ​​RAP. Может ли кто-нибудь предположить, что с этим происходит?IllegalStateException для запуска задания внутри диспетчера размещения

private void addDisposeListener() { 
    treeViewer.getTree().addDisposeListener(new DisposeListener() { 

     @Override 
     public void widgetDisposed(DisposeEvent event) { 
      Job CleanupJob = new Job("Cleanup Job") { //$NON-NLS-1$ 

       @Override 
       protected IStatus run(IProgressMonitor arg0) { 
        doCleanup(); 
        return Status.OK_STATUS; 
       } 
      }; 

      CleanupJob.setUser(false); 
      CleanupJob.setSystem(true); 
      CleanupJob.schedule(); 

     } 
    }); 
} 

ответ

1

Кажется, что RAP пытается выполнить задания, которые созданы в потоке пользовательского интерфейса в контексте текущего UISession (см JobManagerAdapter в rap.ui.workbench). Однако в вашем конкретном случае ожидается, что Job будет выполняться в области приложения («система»).

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

Я бы предположил, что вы подали bug на RAP и включили стек.

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

Смежные вопросы