我有一个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作业,以便我可以确保在应用程序关闭之前完成作业?
答案 0 :(得分:2)
异常消息似乎表明您在关机期间安排了setMessage
,因此可能在代码前加上if (PlatformUI.getWorkbench().isClosing()) return;
这样的内容应该有所帮助。
否则,请尝试将asyncExec
更改为syncExec
以查看问题是否消失。
答案 1 :(得分:0)
按照消息所说的那样做:
“作业应该由计划期间的插件取消 关机“
在启动此作业的插件中,在Activator.stop()
中,确保您的作业实际退出,并且在完成之前不要继续关闭:等待作业以stop()
方法结束。这当然要求您设计计时器作业,使其立即对此取消请求作出反应并终止。
你可以得到比上面更糟糕的消息,但由于它是一个关机,许多人往往忽略这些。例如,假设您的插件A使用了尚未加载的插件B中的类。系统关闭:首先它将stop()
A,然后它将stop()
B.如果您现在安排任务,您将获得B中的班级ClassNotFound
。
如果您的Eclipse不需要存储任何重要内容,那么这一切都无关紧要(只是一条错误消息),但如果正确执行您的Job对于应用程序的数据一致性很重要,那么这可能会导致工具更加麻烦下次再开始。