Joh*_*ood 10 java caching webview
我一直在尝试为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"编写了一个缓存处理程序,以拦截所有URLConnections到默认的sun处理程序.我在这方面取得了一些成功,并且能够缓存.js javascript文件并显着提高性能,但是有一些网站处理错误,特别是Outlook的电子邮件.
在查看我的代码处理方式时,我发现例如URLLoader代码设置了setUsesCaches(false),代码中包含以下注释(在当前1.8.0_66代码中的URLLoader.java的第279行):
//给定WebKit有自己的缓存,不要使用
//任何URLConnection缓存,即使有人安装它们.
//作为副作用,这解决了WebPane不能
正常使用插件缓存的问题,这是
导致RT-11880的原因之一.
那么有人可以告诉我一个真正发生的事情吗?
提前感谢您的任何反馈,
我一直在通过实现我自己的派生类HttpUrlConnection和HttpsUrlConnection使用我自己的URLStreamHandlerFactory.
基本上我拦截所有传出的 http 和 https 请求,检查缓存中是否有数据。如果没有,我从原始资源加载数据并将其存储在缓存目录中。如果我已经拥有数据,我会从缓存中传递它。
我还没有实现缓存头等,因为对于我的用例来说这是没有必要的。
这里要发布的代码太多,但如果您有兴趣,可以在mapjfx上查看代码,并特别检查包中的类com.sothawo.mapjfx.offline。
该解决方案使 WebView 完全不知道缓存的实现。
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |