mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent evt)
{
retrieveItems();
closeAllConnections();
System.exit(0);
}
});
对于上面的代码,retrieveItems()
执行得很好,但是doBackup()
内部有一个名为closeAllConnections()
的后台任务,它根本不执行。该程序似乎跳过了这个任务。以下是closeAllConnections()
包含的内容的简要视图;
public void closeAllConnections()
{
boolean shouldBackup = getBackupOnCloseStatus();
if(shouldBackup)
{
doBackUp();
}
dbManager.disconnectDB();
}
使用Netbeans Step-Debugger后,我注意到程序执行在应用程序退出之前甚至没有输入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.");
}
}
}
答案 0 :(得分:0)
这可能不是最好的答案,但我注意到,有时候拨打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);
}
});
也许这会有所帮助。
答案 1 :(得分:0)
我的猜测是你在其他地方有WindowListener
正在调用System.exit()
,否则你正在做JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
,其中任何一个都会导致应用立即终止,无论是无论其他线程正在执行。