我正在尝试获得一个网站的HTML5离线缓存版本,以显示当网络在webview内部下降。
我已经覆盖了onReceivedError
ok,当网络关闭时,这个方法被调用。问题是它显示一般的"网页不可用"消息。
我怎样才能让它显示网页的HTML5缓存版本?web应用程序的离线存储肯定是有效的,因为它在桌面版本的Firefox和Chrome中运行良好。
我知道我可以在onReceivedError
中手动调用loadData
进入视图,但我不确定我可以从哪里获得HTML5缓存值。
注意:如果我在loadData
中设置一些虚拟数据,例如view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8");
,然后单击back(通过检测back事件并调用webview.goBack();
),则页面的缓存版本显示ok。
下面是我添加的一些代码行来设置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);
尝试使用
查看网络状态private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
(检测Android上是否有Internet连接)
这也需要
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在AndroidManifest.xml
现在您可以将缓存行为设置为LOAD_CACHE_ONLY或LOAD_NO_CACHE,具体取决于网络连接是否可用,使用
webview.getSettings().setCacheMode(...)
我认为一个很好的解决方案是使用LOAD_NORMAL和onReceivedError导航BACK。我认为这将加载缓存根据文档(不确定如果我记得正确),但要小心不要陷入无限循环
这很奇怪…根据文档:
重写缓存的使用方式。缓存的使用方式是基于在导航选项上。对于正常的页面加载,将检查缓存根据需要重新验证内容。当导航返回时,内容不重新验证,而是直接从缓存中提取内容。此函数允许客户端重写此行为。
然而,你想要的行为似乎并不是其中之一:
- LOAD_CACHE_ELSE_NETWORK
使用缓存,如果内容在那里,即使过期(例如,历史导航),如果它不在缓存中,从网络加载。
-
LOAD_CACHE_ONLY
不使用网络,只从缓存加载
-
LOAD_DEFAULT
默认缓存使用模式
-
LOAD_NORMAL
正常缓存使用模式
-
LOAD_NO_CACHE
不要使用缓存,从网络加载
我不知道你是否可以子类化WebView来获得所需的流程。
如果让浏览器来处理,它会不会工作呢?在HTML标签中指定manifest,如下所示:
<html manifest="mycache.appcache">
…当没有可用的连接时,浏览器会自动使用它,你不需要更改任何设置。