【问题标题】:IllegalStateException for running a Job inside a dispose listenerIllegalStateException 在 dispose 侦听器中运行 Job
【发布时间】:2015-11-28 04:09:27
【问题描述】:

我有一个 dispose 侦听器,它在 widgetDisposed(DisposeEvent event) 方法中创建了一个 Job。因此,在处理 TreeViewer 时执行此方法会导致在“清理作业”期间发生内部错误。在请求服务生命周期之外没有可用的上下文。此代码由 RCP 和 RAP 使用,在 RCP 应用程序上运行良好。问题在于 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();

        }
    });
}

【问题讨论】:

    标签: java eclipse rcp jobs eclipse-rap


    【解决方案1】:

    似乎 RAP 尝试在当前 UISession 的上下文中执行在 UI 线程中创建的作业(请参阅 rap.ui.workbench 中的JobManagerAdapter)。但是,在您的特定情况下,作业应在应用程序(“系统”)范围内执行。

    如果小部件因会话终止而被释放,则此作业希望在会话终止后运行。这可以解释错误。

    我建议您针对 RAP 提交 bug 并包含堆栈跟踪。

    与此同时,您可以考虑使用作业进行清理的替代方法。例如,当清理是一项全局任务时,您可以有一个“清理代理”,由 dispose 侦听器通知并异步安排清理。

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2011-08-21
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多