【问题标题】:JavaFx WebView cacheJavaFx WebView 缓存
【发布时间】: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 你有没有运气解决?我也有同样的问题。

标签: java caching webview


【解决方案1】:

我一直在通过实现我自己的派生自HttpUrlConnectionHttpsUrlConnection 的类以及使用我自己的URLStreamHandlerFactory 实现来解决非缓存WebView。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 2013-04-19
    • 2018-06-23
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多