Safari中的Java Applet生命周期,而不是调用destroy()

时间:2014-02-25 21:31:36

标签: java macos safari applet destroy

我正在对遗留网站进行一些更新和错误修复,其中包含几个页面(html文档),每个页面显示多个Java小程序。不幸的是,我在 OS X 10.9.1 Safari 7 上运行时遇到了奇怪的问题。使用 IE Firefox Chrome 在Windows上无法重现该问题。

如何看待问题......

加载第一页时,每个applet实例都正确加载,页面看起来不错(好吧,就像使用applet一样好)。当我导航到下一页时,只有大约一半的applet实例被正确加载,当我最终到达第三页时,没有加载applet。如果我在新选项卡中打开每个新页面然后关闭旧选项卡,则applet加载就好了。

我目前通过调试发现了什么......

通过 Wireshark 查看网络流量,我可以看到Safari在加载页面时从服务器下载了jar文件。

如果我打开了OSX 活动监视器,我可以清楚地看到每个applet实例都被加载到它自己的进程中。导航到新页面时,这些进程不会关闭,而是打开新进程,直到Safari达到每个选项卡的最大插件(或者看起来如此),然后在切换选项卡或Safari关闭之前,不会加载任何其他applet实例。

destroy()方法添加调试输出表明在切换页面时没有调用它。

在OS X和Safari上使用applet时这是一个常见问题吗?你是否有任何解决方案,无论好坏,如何实现这一目标并按预期工作?

更新2014-03-04

使用以下applet代码

可以重现该问题
import java.applet.Applet;

public class Simple extends Applet {
    public Simple() {
        System.err.println("!!! SIMPLE()");
    }
    public void stop() {
        System.err.println("!!! STOP()");
    }
    public void start() {
        System.err.println("!!! START()");
    }
    public void init() {
        System.err.println("!!! INIT()");
    }
    public void destroy() {
        System.err.println("!!! DESTROY()");
    }
}

在OS X 10.9.1,Safari 7和最新的Java上运行我可以清楚地看到applet已初始化并已启动但从未停止或销毁。

0 个答案:

没有答案