在android中显示webview的缓存版本
我正在尝试获取网站的 HTML5 离线缓存版本,以便在网络视图内网络中断时显示。
我已经重写了 onReceivedError ,当网络关闭时,会调用此方法。 问题是它显示一般的“网页不可用”消息。
我怎样才能让它显示页面的 HTML5 缓存版本? Web 应用程序的离线存储肯定可以正常工作,因为它在桌面版 Firefox 和 Chrome 中运行良好。
我知道我可以在 onReceivedError
中手动调用 loadData
到视图中,但我不确定从哪里可以获取 HTML5 缓存值。
注意:如果我在 loadData
中设置一些虚拟数据,例如 view.loadData(Uri.encode("
webview.goBack();
然后缓存页面的版本显示正常,
以下是我添加的一些用于设置 webview 的代码行:
webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
webview.getSettings().setAppCacheMaxSize(1024*1024*8);
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache");
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);
I am trying to get the HTML5 offline cached version of a website to display when the network is down inside of a webview.
I have overridden onReceivedError
ok, and when the network is down this method is called.
Problem is that it displays the generic "Web Page is not available" message.
How can I get it to display the HTML5 cached version of the page?
The offline storage of the webapp is definately working, as it works fine in the desktop version of Firefox and Chrome.
I know I can call loadData
into the view manually in onReceivedError
, but im not sure where I can get the HTML5 cached value from.
Note: If I set some dummy data in loadData
such as view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8");
and then click back (by detecting back event and calling webview.goBack();
then the cached version of the page is displayed ok.
Here are some lines of code I added to setup the webview:
webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
webview.getSettings().setAppCacheMaxSize(1024*1024*8);
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache");
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
尝试使用
(检测是否存在Android 上可用的互联网连接)
这也需要
在您的 AndroidManifest.xml 中
现在您可以将缓存行为设置为 LOAD_CACHE_ONLY 或 LOAD_NO_CACHE,具体取决于网络连接是否可用,
Try to find out the network status using
(Detect whether there is an Internet connection available on Android)
This also needs
in your AndroidManifest.xml
Now you can set the cache behaviour either to LOAD_CACHE_ONLY or to LOAD_NO_CACHE, depending on whether a network connection is available, with
我认为一个好的解决方案是使用 LOAD_NORMAL 和 onReceivedError 导航返回。我认为这将根据文档加载缓存(不确定我是否记得正确),但要小心不要陷入无限循环
这很奇怪..根据 文档:
然而,您想要的行为似乎不是其中之一:
<块引用>
如果内容存在,即使过期(例如历史导航),也使用缓存。如果内容不在缓存中,则从网络加载。
LOAD_CACHE_ONLY
<块引用>
不使用网络,仅从缓存加载。
LOAD_DEFAULT
<块引用>
默认缓存使用模式
LOAD_NORMAL
<块引用>
正常缓存使用模式
LOAD_NO_CACHE
<块引用>
不使用缓存,从网络加载
我不知道您是否可以子类化 WebView 以获得所需的流量。
I think a good solution would be to use LOAD_NORMAL and onReceivedError Navigate BACK. I think this will load the cache according to the documentation (not sure if I remember correctly) but be carefull no to get stuck in an infinite loop
It is weird.. According to the documentation:
However the behavior you want does not seem to be one of these:
LOAD_CACHE_ONLY
LOAD_DEFAULT
LOAD_NORMAL
LOAD_NO_CACHE
I do not know if you can subclass the WebView to get the desired flow.
如果直接让浏览器处理这个问题是不是就不行了?在 HTML 标记中指定清单,如下所示:
...当没有可用连接时,浏览器应自动使用它,您根本不需要更改任何设置。
Does it not work if you simply let the browser handle this? Specify the manifest in the HTML tag like this:
...and the browser should automatically use it when there's no connection available, you shouldn't need to change any settings at all.