【发布时间】:2016-01-16 01:53:23
【问题描述】:
我一直在尝试为 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”编写了一个缓存处理程序,以拦截到默认 sun 处理程序的所有 URLConnection。我在这方面取得了一些成功,并且能够缓存 .js javascript 文件并显着提高性能,但是在处理一些网站时存在错误,尤其是 Outlook 的电子邮件。
在查看我的代码处理方式时,我发现例如 URLLoader 代码在代码中使用以下 cmets 设置 setUsesCaches(false)(当前 1.8.0_66 代码中 URLLoader.java 的第 279 行):
// 鉴于 WebKit 有自己的缓存,不要使用
// 任何 URLConnection 都会缓存,即使有人安装了它们。
// 作为一个副作用,这修复了 WebPane 不存在的问题
// 与插件缓存一起工作,这是
之一
// RT-11880 的原因。
那么有人可以告诉我到底发生了什么吗?
- Oracle 文档说 WebKit 有一个内存缓存,可以被 ResponseCache 覆盖,但事实并非如此。
- JDK-8014501 说明了问题,但已被标记为“不是问题”。为什么这不是问题?
- 围绕“URL.setURLStreamHandlerFactory”和“URLConnection”拦截的重要编码产生了具有显着性能提升的功能缓存,但由于故意引入 URLLoader 代码中的问题而无法解决。
提前感谢您的任何反馈,
【问题讨论】:
-
我有相反的效果/问题。我的 CSS 文件被 WebView 缓存,我无法阻止它!仅在重新启动整个 Java(FX)-应用程序后(或在每次更改时重命名 CSS 文件时)才能看到对我的 CSS 所做的更改。覆盖
ResponseCache对我不起作用(我的响应缓存永远不会被调用)... -
很奇怪,这也与您的问题完全相反:stackoverflow.com/q/16211920/3887073
-
@Ben 你有没有运气解决?我也有同样的问题。