2015-10-17 134 views
9

我一直在试图为WebView实现基于光盘的缓存,但只取得了部分成功,我特别试图缓存.js JavaScript外部文件,这会减慢JavaScript网页的加载速度。JavaFx WebView缓存

Oracle文档指出: “当web视图组件工作时,你应该记住,它具有默认的内存缓存 这意味着,一旦含有的WebView组件在应用程序关闭任何缓存的内容会丢失。 但是,开发人员可以通过java.net.ResponseCache类在应用程序级别实现缓存。“

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

我证实了通过分析网络通信量的WebView不缓存,从而证实了什么是JDK-8014501说: “虽然使用JavaFX的WebView组件javafx.scene.web.WebView导航,才发现, 每请求每次从服务器检索所有资源,即使以前的活动刚刚检索到资源。此行为已通过捕获和分析网络流量进行验证。 性能影响相当大。 JDK-8014501,于是我使用“URL.setURLStreamHandlerFactory”编写了一个缓存处理程序来拦截所有的URLConnections到默认的sun处理程序。我在这方面取得了一些成功,并且能够缓存.js javascript文件并显着提高性能,但是有些bug处理某些网站,特别是Outlook的电子邮件。

在研究我的代码处理方式时,例如,我发现URLLoader代码在代码中设置了setUsesCaches(false),代码中包含以下注释(URLLoader.java的第279行,代码为当前1.8.0_66) :
//鉴于WebKit具有其自己的缓存,请勿使用任何URLConnection缓存,即使有人安装它们也不要使用

//作为一个副作用,这可以修复WebPane问题而不是
//可以和插件缓存一起使用,该插件缓存是
// RT-11880的原因之一。

那么有人可以给我一个关于真正发生的事情吗?

  • Oracle文档说WebKit有一个可以被ResponseCache覆盖的内存缓存,事实并非如此。
  • JDK-8014501声明问题,但被标记为“不是问题”。为什么这不是问题?
  • 对“URL.setURLStreamHandlerFactory”和“URLConnection”拦截进行编码的signifant产生了一个功能缓存,其性能显着提高,但是被故意引入到URLLoader代码中的问题取消了。

预先感谢任何反馈,

+1

我有相反的效果/问题。我的CSS文件由WebView缓存,我无法阻止它!只有在RESTARTING整个Java(FX) - 应用程序(或每次更改时重命名CSS文件)之后,我的CSS更改才可见。覆盖'ResponseCache'对我来说不起作用(我的响应缓存永远不会被调用)... – Ben

+0

很奇怪,这里也是与你的问题完全相反的:http://stackoverflow.com/q/16211920/3887073 – Ben

+0

@本你有没有解决好运?我也有同样的问题。 –

回答

1

我一直在努力周围无缓存的WebView通过实现从HttpUrlConnectionHttpsUrlConnection派生我自己的类,并通过我自己的实现的URLStreamHandlerFactory

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

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

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

该解决方案使WebView完全不了解缓存实现。