在android中显示缓存的webview版本
Posted
技术标签:
【中文标题】在android中显示缓存的webview版本【英文标题】:displaying cached version of webview in android 【发布时间】:2012-01-18 01:46:38 【问题描述】:我正在尝试让网站的 html5 离线缓存版本在 web 视图内的网络出现故障时显示。
我已经覆盖了onReceivedError
ok,当网络中断时这个方法被调用。
问题是它显示通用的“网页不可用”消息。
如何让它显示页面的 HTML5 缓存版本? webapp 的离线存储绝对可以正常工作,因为它在桌面版本的 Firefox 和 Chrome 中运行良好。
我知道我可以在onReceivedError
中手动将loadData
调用到视图中,但我不确定我可以从哪里获取HTML5 缓存值。
注意:如果我在loadData
中设置了一些虚拟数据,例如view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8");
,然后单击返回(通过检测返回事件并调用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);
【问题讨论】:
【参考方案1】:尝试使用
找出网络状态private boolean isNetworkAvailable()
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
(Detect whether there is an Internet connection available on Android)
这也需要
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在您的 AndroidManifest.xml 中
现在您可以将缓存行为设置为 LOAD_CACHE_ONLY 或 LOAD_NO_CACHE,具体取决于网络连接是否可用
webview.getSettings().setCacheMode(...)
【讨论】:
这可能是“最干净”的解决方案,所以我给你赏金点:)【参考方案2】:我认为一个好的解决方案是使用 LOAD_NORMAL 和 onReceivedError Navigate BACK。我认为这将根据文档加载缓存(不确定我是否记错了),但要小心不要陷入无限循环
这很奇怪..根据documentation:
覆盖缓存的使用方式。缓存的使用方式是基于 在导航选项上。对于正常的页面加载,检查缓存 并根据需要重新验证内容。导航返回时,内容 不会重新验证,而是从缓存中提取内容。 此函数允许客户端覆盖此行为。
但是您想要的行为似乎不是以下之一:
-
LOAD_CACHE_ELSE_NETWORK
如果内容存在,则使用缓存,即使已过期(例如,历史导航)如果不在缓存中,则从网络加载。
LOAD_CACHE_ONLY
不使用网络,仅从缓存加载。
LOAD_DEFAULT
默认缓存使用模式
LOAD_NORMAL
正常的缓存使用模式
LOAD_NO_CACHE
不使用缓存,从网络加载
我不知道您是否可以将 WebView 子类化以获得所需的流程。
【讨论】:
@Marty 您是否尝试将 LOAD_DEFAULT 更改为 LOAD_NORMAL 当我使用 LOAD_NORMAL 时网络连接断开时,仍然只有通用的“网页不可用”消息 我创建了一个“解决方法”,在其中加载 LOAD_NO_CACHE 版本,如果失败,则在 onReceivedError 中加载 LOAD_CACHE_ONLY 版本.. 我有这个工作,但它是一个相当狡猾的工作,我是希望有一个干净的解决方案。它有点傻,它没有对此的原生支持.. 我认为一个好的解决方案是使用 LOAD_NORMAL 和 onReceivedError Navigate BACK。我认为这将根据文档加载缓存(不确定我是否记错了),但要小心不要陷入无限循环【参考方案3】:如果您只是让浏览器处理它,它不会起作用吗?在 HTML 标记中指定清单,如下所示:
<html manifest="mycache.appcache">
...当没有可用连接时,浏览器应该会自动使用它,您根本不需要更改任何设置。
【讨论】:
以上是关于在android中显示缓存的webview版本的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio,在新活动中显示完整的 WebView