在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); 

  • 仅在模拟器中使用WebView.loadData()的“网页不可用”
  • 具有自定义标题的Android WebView发布请求
  • 在React Native中从应用程序本身的webviewredirect到移动应用程序
  • 在普通浏览器中从Android Webview打开链接作为popup窗口
  • 如何从Android WebView检查页面是否为“404页面未find”?
  • 存储WebView进行脱机浏览
  • 如何在网页视图中加载的网页进行replace
  • 如何解决“因为我们正在等待WebCore的响应触摸下来,
  • 尝试使用找出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版本