我一直在尝试为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代码中的问题而被撤销。
提前感谢任何反馈,
ResponseCache
对我没有效果(我的响应缓存永远不会被调用)... - Ben