我有一个dispose侦听器,它在widgetDisposed(DisposeEvent事件)方法中创建了一个Job。因此,当TreeViewer被处置时执行此方法导致在“清理作业”期间发生内部错误。在请求服务生命周期之外没有可用的上下文。此代码由RCP和RAP使用,在RCP app上正常工作.Issue与RAP一起使用。任何人都可以说明这有什么问题吗?
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();
}
});
}
答案 0 :(得分:1)
似乎RAP尝试在当前UISession的上下文中执行在UI线程中创建的作业(请参阅rap.ui.workbench中的JobManagerAdapter
)。但是,在您的特定情况下,Job应该在应用程序(" system")范围内执行。
如果窗口小部件由于会话终止而被处置,则此作业希望在会话终止后运行。这可以解释错误。
我建议您针对RAP提交bug并包含堆栈跟踪。
与此同时,您可以考虑使用Job进行清理的替代方法。例如,当清理是一项全局任务时,您可以拥有一个"清理代理"由dispose监听器和日程表异步清理通知。