4

我有一个 Eclipse rcp 应用程序,它定期(每 5 秒)在子线程中执行一些工作。该线程执行一个方法来更新应用程序的状态行以指示工作已完成。它看起来像这样:

protected void updateStatusBar()
{
     Display.getDefault().asyncExec(new Runnable() {
         @Override
         public void run() {
             PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(MainView.ID).
             getViewSite().getActionBars().getStatusLineManager().setMessage("work finished");   
         }
     });
}

它运行良好。我遇到的问题是,当我关闭我的应用程序时,我会不时收到带有此错误的空指针异常:

平台关闭后发现作业仍在运行。作业应由在关机期间安排它们的插件取消:>org.eclipse.ui.internal.progress.TaskBarProgressManager$2

问题是由于异步执行,作业正在运行,但同时由于关闭应用程序,一切都被破坏了。那么有没有办法获取/等待正在运行的 UI 作业,以便我可以确保在应用程序关闭之前完成作业?

4

2 回答 2

2

异常消息似乎表明您setMessage在关机期间安排了时间,因此可能在您的代码前面加上类似的东西if (PlatformUI.getWorkbench().isClosing()) return;应该会有所帮助。否则,请尝试更改asyncExecsyncExec查看问题是否消失。

于 2012-04-14T00:32:52.047 回答
0

只需按照消息中的说明进行操作:

“作业应该由在关机期间安排它们的插件取消”

在启动此作业的插件中Activator.stop(),确保您的作业实际退出并且在完成之前不要继续关闭:在stop()方法中等待作业结束。这当然需要您设计计时器作业,使其立即对此取消请求作出反应并终止。

您可能会收到比上述消息更糟糕的消息,但由于是关闭,许多人倾向于忽略这些消息。例如,假设您的插件 A 使用插件 B 中尚未加载的类。系统关闭:首先是stop()A,然后是stop()B。如果您现在安排了任务,您将获得ClassNotFoundB 中的班级的 A。

如果您的 Eclipse 不需要存储任何重要的东西,那么这一切都是无关紧要的(只是一条错误消息),但是如果您的 Job 的正确执行对于您的应用程序的数据一致性很重要,那么这可能会导致更多的麻烦该工具是 startet下次。

于 2016-03-05T06:48:18.423 回答