我一直在尝试为 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 的原因。
所以有人可以告诉我到底发生了什么吗?
提前感谢您的任何反馈,
最佳答案
我一直在通过实现我自己的派生自 HttpUrlConnection 的类来解决非缓存 WebView和 HttpsUrlConnection并使用我自己的 URLStreamHandlerFactory 实现.
基本上我会拦截所有传出的 http 和 https 请求,检查我的缓存中是否有数据。如果不是,我从原始资源加载数据并存储在缓存目录中。如果我已有数据,我会从缓存中传送它。
我没有实现缓存 header 等,因为对于我的用例来说这不是必需的。
此处代码太多,但如果您有兴趣,可以在mapjfx 查看代码。并特别检查 com.sothawo.mapjfx.offline 中的类包。
这个解决方案让 WebView 完全不知道缓存的实现。
关于JavaFx WebView 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185254/
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
当我尝试进行bundle安装时,我的gem_path和gem_home指向/usr/local/rvm/gems/我没有写入权限,并且由于权限无效而失败。因此,我已将两个路径都更改为我具有写入权限的本地目录。这样做时,我进行了bundle安装,我得到:bruno@test6:~$bundleinstallFetchinggemmetadatafromhttps://rubygems.org/.........Fetchinggemmetadatafromhttps://rubygems.org/..Bundler::GemspecError:Couldnotreadgemat/afs/
我一直在Heroku上尝试不同的缓存策略,并添加了他们的memcached附加组件,目的是为我的应用程序添加Action缓存。但是,当我在我当前的应用程序上查看Rails.cache.stats时(安装了memcached并使用dalligem),在执行应该缓存的操作后,我得到current和total_items为0。在Controller的顶部,我想缓存我有的Action:caches_action:show此外,我修改了我的环境配置(对于在Heroku上运行的配置)config.cache_store=:dalli_store我是否可以查看其他一些统计数据,看看它是否有效或我做错
我有一个具有页面缓存的ControllerAction,我制作了一个清扫程序,它使用Controller和指定的Action调用expire_page...Controller操作呈现一个js.erb模板,所以我试图确保expire_page删除public/javascripts中的.js文件,但它没有这样做。classJavascriptsController"javascripts",:action=>"lol",:format=>'js')endend...所以,我访问javascripts/lol.js并呈现我的模板。我验证了public/javascripts/lol.js
我的Controller有这个:caches_action:render_ticker_for_channel,:expires_in=>30.seconds在我的路由文件中我有这个:match'/render_c_t/:channel_id'=>'render#render_ticker_for_channel',:as=>:render_channel_ticker在日志文件中我看到了这个:Writefragmentviews/mcr3.dev/render_c_t/63(11.6ms)我如何手动使它过期?我需要从与渲染Controller不同的Controller使它过期,但即使
我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了
我正在使用Capybara2.1和Ruby1.9.3,使用selenium驱动程序(带有Minitest和测试单元)来测试网络应用程序。我正在努力解决StaleElementReferenceException问题。我已经看到很多关于该主题的讨论,但我无法找到解决我所面临问题的方法。所以基本上,我试图使用以下代码在我的页面上找到所有分页元素:pagination_elements=page.all('.paginationa')然后我对这些元素做一些断言,例如:pagination_elements.first.must_have_content('1')在这些断言之后,我通过单击下一
HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca
我正在构建一个Rails应用程序,该应用程序将基本上包含一组SOAP命令。我不想每次都获取WSDL来实现某种缓存方法,尽管我不太确定从哪里开始执行此操作。是否有特定于Rails的东西可以帮助我,或者我应该通过Ruby下载文件并加载它?只是在寻找某种总体方向...... 最佳答案 如果您使用savon然后是remoteWSDLwillbedownloadedonceperclientinstance:the(remote)WSDLhastobedownloadedandparsedonceforeveryclientandsocome