0
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.");
        }
    }
}
4

2 回答 2

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);
    }
});

也许这会有所帮助。

于 2013-03-20T03:50:11.353 回答
0

我的猜测是您在其他WindowListener地方有另一个正在调用System.exit(),或者您正在执行 a JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),其中任何一个都会导致应用程序立即终止,而不管其他线程正在执行什么。

于 2013-03-20T03:55:41.450 回答