这又是一个非常普遍的问题,而且E4似乎没有真正的支持(但如果我没记错的话,它在E3中也不起作用。)
我想在应用程序关闭时关闭我的数据库连接。或者更一般:我想在退出时进行任何清理。
所以通常的API是:
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public ApplicationWorkbenchWindowAdvisor(final IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
@Override
public boolean preWindowShellClose() {
if (PlatformUI.getWorkbench().getWorkbenchWindowCount() <= 1) {
// the last window is about to close
Datababase.close();
}
return super.preWindowShellClose();
}
}
问题?每次应用程序关闭时都不会调用它,特别是不在PlatformUI.getWorkbench().close();
上(即使JavaDoc声称此方法关闭了窗口)。
(如果您想测试此声明是否正确,只需使用ExitHandler
关闭您的应用,则不会调用preWindowShellClose()
。)
我可以创建自己的处理程序并再次手动调用清理方法,但我希望有更好的方法。
您可以对应用程序关闭做出反应的另一种方法是Shutdown Hooks API:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
Datababase.close();
}));
问题:对于RCP应用程序,此挂钩被称为方式,方式,太晚,例如,所有插件都已关闭。
我觉得必须有一种简单(和工作)的方式,我还没有找到它。如果它很重要,我们使用的是Lesser Evil Eclipse(又名E3兼容性)。
如何在应用程序关闭时运行代码?
答案 0 :(得分:2)
使用IWorkbench::addWindowListener
或IWorkbench::addWorkbenchListener
在工作台窗口关闭或工作台关闭时收到通知。
您也可以考虑使用捆绑的stop
方法运行清理代码。