目前使用JxBrowser 6.14.2诊断我们在Swing应用程序中发现的错误。在加载时,它会创建一个新的轻量级Browser实例,然后为触摸屏兼容性等内容添加一些监听器。每当父窗口关闭时,我们会在关闭窗口之前在浏览器对象上调用dispose()。 99%的时间,这按预期工作。有时,当快速关闭/打开窗口时,dispose()会导致整个应用程序锁定。我查看了一个线程转储,发现SocketChannel.waitForPendingPostRequests()是罪魁祸首,因为在SocketChannel使用的任何队列中都有Message对象永远不会被删除。队列中的消息始终是GetDocumentMessage或GetDocumentElementMessage,它将我引回到实例化浏览器后添加触摸屏侦听器的方法。如果我删除了我们的侦听器方法(以及几乎相同的removeClickListener),我无法复制此问题:
private void addClickListener(Browser browser) {
if (!browser.isDisposed()) {
DOMDocument doc = browser.getDocument();
if (doc != null && doc.getDocumentElement() != null) {
doc.getDocumentElement().addEventListener(DOMEventType.OnClick, clickListener, false);
}
}
}
鉴于我们需要能够随意实例化和处理浏览器对象,是否有一种安全的方法可以在创建新的浏览器实例后添加这些侦听器,或者有没有办法在之前清除SocketChannel队列调用dispose()?
谢谢!