我正在尝试将网站的HTML5离线缓存版本显示在网络内部网络视图中时显示。
我已覆盖onReceivedError
确定,当网络关闭时,会调用此方法。
问题是它显示通用的“网页不可用”消息。
如何让它显示HTML5缓存版本的页面? webapp的离线存储肯定有效,因为它在桌面版Firefox和Chrome中运行良好。
我知道我可以在loadData
中手动调用onReceivedError
,但我不知道从哪里可以获取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);
答案 0 :(得分:6)
尝试使用
查找网络状态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(...)
答案 1 :(得分:2)
我认为一个好的解决方案是使用LOAD_NORMAL和onReceivedError Navigate BACK。我认为这将根据文档加载缓存(不确定我是否记得正确)但要小心不要陷入无限循环
很奇怪..根据documentation:
覆盖缓存的使用方式。使用缓存的方式是基于的 在导航选项上。对于正常页面加载,将检查缓存 并根据需要重新验证内容。导航回来时,内容 没有重新验证,而是从缓存中提取内容。 此函数允许客户端覆盖此行为。
但是,您想要的行为似乎不是其中之一:
如果有内容,则使用缓存,即使已过期(例如,历史导航)如果它不在缓存中,则从网络加载。
请勿使用网络,仅从缓存加载。
默认缓存使用模式
正常缓存使用模式
请勿使用缓存,从网络加载
我不知道您是否可以继承WebView以获得所需的流程。
答案 2 :(得分:1)
如果您只是让浏览器处理此问题,它是否无效?在HTML标记中指定清单,如下所示:
<html manifest="mycache.appcache">
...如果没有可用的连接,浏览器应自动使用它,您根本不需要更改任何设置。
答案 3 :(得分:1)
您应首先在 AndroidManifest.xml
中设置权限<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
然后通过以下方式检查互联网网络是否开启:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService( CONNECTIVITY_SERVICE );
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
最后使用 Webview 对象
添加以下代码webView = (WebView) findViewById(R.id.WebEngine);
webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
if ( !isNetworkAvailable() ) { // loading offline
webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
}
webView.loadUrl("http://www.geekonjava.blogspot.com/?m=1");
如果您的互联网您的网页打开正常版并保存在缓存中,如果互联网已关闭,那么它会自动< strong>在缓存版本中打开。