gpt4 book ai didi

JavaFx WebView 缓存

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:35 26 4
gpt4 key购买 nike

我一直在尝试为 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 进行导航时,发现,每个请求每次都从服务器检索所有资源,即使之前的 Activity 刚刚检索了资源。通过捕获和分析网络流量验证了此行为。性能影响是相当大的。 "

JDK-8014501 似乎没有任何结果,所以我随后使用“URL.setURLStreamHandlerFactory”编写了一个缓存处理程序来拦截默认 sun 处理程序的所有 URLConnections。我在这方面取得了一些成功,能够缓存 .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 代码的问题而无法实现。

提前感谢您的任何反馈,

最佳答案

我一直在通过实现我自己的派生自 HttpUrlConnection 的类来解决非缓存 WebView和 HttpsUrlConnection并使用我自己的 URLStreamHandlerFactory 实现.

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

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

此处代码太多,但如果您有兴趣,可以在mapjfx 查看代码。并特别检查 com.sothawo.mapjfx.offline 中的类包。

这个解决方案让 WebView 完全不知道缓存的实现。

关于JavaFx WebView 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com