JavaFx WebView缓存

10

我一直在尝试为WebView实现基于磁盘的缓存,但只有部分成功。我特别想缓存.js的JavaScript外部文件,因为它们会严重拖慢JavaScript网页的加载速度。

Oracle文档指出: “在使用WebView组件时,您应该记住它具有默认的内存缓存。这意味着任何缓存的内容在包含WebView组件的应用程序关闭时都会丢失。然而,开发人员可以通过java.net.ResponseCache类在应用程序级别实现缓存。”

但事实并非如此。我使用java.net.ResponseCache类实现了一个内存缓存,但WebView很少使用它——偶尔从缓存中存储和检索favicon.png——没有性能提升。

通过分析网络流量,我确认了WebView没有缓存的事实,这证实了JDK-8014501所述: “当使用JavaFX WebView组件javafx.scene.web.WebView进行导航时,发现即使之前的活动刚刚检索了资源,每个请求也会每次从服务器检索所有资源。通过捕获和分析网络流量验证了这种行为。性能影响是相当大的。”

JDK-8014501好像没有任何结果,所以我用“URL.setURLStreamHandlerFactory”编写了一个缓存处理程序,以拦截所有URLConnection到默认的sun处理程序。我在这方面取得了一些成功,并能够缓存.js JavaScript文件并显著提高性能,但处理某些网站(特别是Outlook电子邮件)时存在一些错误。

在研究我的代码处理方式时,我发现例如URLLoader代码设置了setUsesCaches(false),并在代码中添加了以下注释(在当前1.8.0_66代码的URLLoader.java第279行):
//鉴于WebKit有自己的缓存,请不要使用
//任何URLConnection缓存,即使有人安装它们。
//作为一个副作用,这修复了WebPane不
//与插件缓存很好地工作的问题,这是RT-11880的原因之一。

那么,请问有谁能给我指点一下实际情况呢?

  • Oracle的文档说WebKit有一个可以被ResponseCache覆盖的内存缓存,但事实并非如此。
  • JDK-8014501记录了这个问题,但已被标记为“不是问题”。为什么不是问题?
  • 在"URL.setURLStreamHandlerFactory"和"URLConnection"拦截周围进行了显著的编码,产生了具有显著性能提升的功能性缓存,但由于故意引入到URLLoader代码中的问题而被撤销。

提前感谢任何反馈,


1
我遇到了相反的效果/问题。我的CSS文件被WebView缓存了起来,我无法阻止它!只有在重新启动整个Java(FX)应用程序时,才能看到对CSS的更改(或者在每次更改时重命名CSS文件)。覆盖ResponseCache对我没有效果(我的响应缓存永远不会被调用)... - Ben
奇怪的是,这里也存在与你的问题完全相反的情况:https://dev59.com/uXHYa4cB1Zd3GeqPK2I_ - Ben
@Ben,你有解决这个问题的好运吗?我也遇到了同样的问题。 - Jason S
1个回答

1

我一直在实现自己的类来替代不支持缓存的WebView,这些类派生自HttpUrlConnectionHttpsUrlConnection,并使用我的URLStreamHandlerFactory实现。

基本上,我拦截所有传出的http和https请求,检查缓存中是否有数据。如果没有,我会从原始资源加载数据并将其存储在缓存目录中。如果我已经有了数据,我将从我的缓存中提供它。

我没有实现缓存头等功能,因为对于我的用例来说这是不必要的。

这里的代码太多了,但是如果您有兴趣,可以查看mapjfx上的代码,特别是位于com.sothawo.mapjfx.offline包中的类。

这种解决方案使WebView完全不知道缓存实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接