在android中显示webview的caching版本

我试图让networking的HTML5离线caching版本显示,当networking停在一个web视图。

我已经覆盖onReceivedError ok了,当networkingclosures时,这个方法被调用。 问题是它显示通用的“网页不可用”消息。

我怎样才能让它显示页面的HTML5caching版本? Web应用程序的离线存储是可以正常工作的,因为它在桌面版的Firefox和Chrome中运行良好。

我知道我可以在onReceivedError手动调用loadData到视图,但我不知道从哪里可以得到HTML5caching的值。

注意:如果我在loadDataview.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8"); 然后点击返回(通过检测返回事件并调用webview.goBack();然后页面的caching版本显示正常。

以下是我添加到安装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); 

Solutions Collecting From Web of "在android中显示webview的caching版本"

尝试使用找出networking状态

 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中

现在,您可以将caching行为设置为LOAD_CACHE_ONLY或LOAD_NO_CACHE,具体取决于networking连接是否可用,

 webview.getSettings().setCacheMode(...) 

我认为一个好的解决scheme是使用LOAD_NORMAL和onReceivedError导航返回。 我认为这将加载caching根据文档(不知道如果我没记错的话),但要小心,不要陷入无限循环


这很奇怪。根据文件 :

覆盖caching的使用方式。 caching的使用方式基于导航选项。 对于正常的页面加载,检查caching并根据需要重新validation内容。 在返回时,内容不被重新validation,而是从caching中取出内容。 这个函数允许客户覆盖这个行为。

然而,你想要的行为似乎不是其中之一:

  1. LOAD_CACHE_ELSE_NETWORK

    如果内容存在,则使用caching,即使过期(例如,history nav)如果不在caching中,则从networking加载。

  2. LOAD_CACHE_ONLY

    不要使用networking,只从caching中加载。

  3. LOAD_DEFAULT

    默认caching使用模式

  4. LOAD_NORMAL

    正常caching使用模式

  5. LOAD_NO_CACHE

    不要使用caching,从networking加载


我不知道你是否可以inheritanceWebView来获得所需的stream程。


如果你只是让浏览器处理这个问题,它不工作吗? 在HTML标签中指定清单,如下所示:

 <html manifest="mycache.appcache"> 

…当没有连接可用时,浏览器应该自动使用它,你根本不需要改变任何设置。

您应该首先在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"); 

多数民众赞成如果您的互联网在您的网页上打开正常版本,并保存在caching,如果您的互联网closures,然后它会自动打开caching版本