在android中显示webview的缓存版本

时间:2011-12-11 22:21:46

标签: android html5 webview offline-caching offline-mode

我正在尝试将网站的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);

4 个答案:

答案 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

  

覆盖缓存的使用方式。使用缓存的方式是基于的   在导航选项上。对于正常页面加载,将检查缓存   并根据需要重新验证内容。导航回来时,内容   没有重新验证,而是从缓存中提取内容。   此函数允许客户端覆盖此行为。

但是,您想要的行为似乎不是其中之一:

  1. LOAD_CACHE_ELSE_NETWORK
      

    如果有内容,则使用缓存,即使已过期(例如,历史导航)如果它不在缓存中,则从网络加载。

  2.   
  3. LOAD_CACHE_ONLY

      

    请勿使用网络,仅从缓存加载。

  4. LOAD_DEFAULT

      

    默认缓存使用模式

  5. LOAD_NORMAL

      

    正常缓存使用模式

  6. LOAD_NO_CACHE

      

    请勿使用缓存,从网络加载


  7. 我不知道您是否可以继承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>在缓存版本中打开。