mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent evt)
{
retrieveItems();
closeAllConnections();
System.exit(0);
}
});
对于上面的代码,retrieveItems()
执行得很好,但是在closeAllConnections()
内部有一个名为doBackup()
的后台任务根本没有执行。程序似乎跳过了任务。以下是closeAllConnections()
所包含内容的简要视图;
public void closeAllConnections()
{
boolean shouldBackup = getBackupOnCloseStatus();
if(shouldBackup)
{
doBackUp();
}
dbManager.disconnectDB();
}
使用Netbeans步骤调试器后,我注意到程序执行在应用程序退出之前甚至没有进入doBackup()
方法。这很奇怪。我将高度感谢任何帮助,关于什么可能导致这种行为。谢谢善良的人们!
只是如果这一块额外的信息可能有助于找到一个解决方案,我使用Swing应用程序框架,所以任务doBackup()
看起来像下面…
@Action
public Task doBackUp()
{
return new DoBackUpTask(getApplication());
}
private class DoBackUpTask extends org.jdesktop.application.Task<Object, Void>
{
private boolean done = false;
DoBackUpTask(org.jdesktop.application.Application app)
{
super(app);
this.setMessage("Backing-up database...");
}
@Override
protected Object doInBackground()
{
File destDir = new File(appManager.getBackUpDir());
done = backUpDataBase(destDir);
return null;
}
@Override
protected void succeeded(Object result)
{
if(done)
{
setMessage("BackUp completed.");
}
}
}
我的猜测是,你在其他地方有另一个WindowListener
,调用System.exit()
或者你正在做JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
,这两种情况都会导致应用程序立即终止,无论其他线程正在执行什么
这可能不是最好的答案,但我注意到,当调用System.exit(0)
有时它会切断一切。当调用依赖于前一行结果的方法时,我遇到了一个问题。一切都应该正常,但它没有正常工作,因为它在前一行完成之前执行了下一行。我相信有人可以更多地谈论事件分派线程,以及为什么它似乎发生了,尽管计算机科学的一切都说它不应该发生。但这是我的想法:为closeAllConnections添加一个布尔返回值,以便在完成时返回true,然后像这样重写您的窗口侦听器:
mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent evt)
{
boolean isClosed = false;
while(!isClosed){
retrieveItems();
isClosed = closeAllConnections();
}
System.exit(0);
}
});