运行 应用程序关闭时的代码

Run Code On Application Close

这又是一个非常常见的问题,而且似乎在 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 声称此方法会关闭 windows)。

(如果您想测试此声明是否正确,只需使用 ExitHandler 关闭您的应用程序 - 然后不会调用 preWindowShellClose()。)

我可以创建自己的处理程序并再次手动调用清理方法,但我希望有更好的方法。

您可以对应用程序关闭做出反应的另一种方式是 Shutdown Hooks API:

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    Datababase.close();
}));

问题:对于 RCP 应用程序,这个钩子调用方式太晚了,例如届时所有插件都已关闭

我觉得一定有一个简单(而且有效)的方法,只是我还没有找到。如果它很重要,我们正在使用 Lesser Evil Eclipse(又名 E3 兼容性)。

如何在应用程序关闭时运行编写代码?

使用 IWorkbench::addWindowListenerIWorkbench::addWorkbenchListener 在 workbench window 关闭或 workbench 关闭时收到通知。

您也可以考虑 运行 捆绑包的 stop 方法中的清理代码。