2011-12-11 44 views
9

我试图让网络的HTML5离线缓存版本在webview内部关闭时显示。在android中显示webview的缓存版本

我已经覆盖onReceivedError ok,并且当网络关闭时调用此方法。 问题是它显示通用的“网页不可用”消息。

如何获取它以显示HTML5缓存版本的页面? Web应用程序的离线存储器可以正常工作,因为它可以在桌面版Firefox和Chrome中正常工作。

我知道我可以在onReceivedError手动调用loadData进入视图,但我不知道从哪里可以获取HTML5缓存值。

注:如果我在loadDataview.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8");,然后单击后退(设置一些虚拟的数据通过检测回事件,并呼吁webview.goBack();那么页面的缓存版本的显示OK

下面是一些代码行。我加入到设置web视图:

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

回答

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(...) 
+0

这可能是“最干净”的解决方案,所以生病给你的赏金点:) – Marty

2

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


很是怪异。根据该documentation

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

不过你想要的行为似乎并没有成为其中之一:

  1. LOAD_CACHE_ELSE_NETWORK

    使用缓存,如果内容是存在的,即使过期(例如,历史NAV)如果它不在缓存中,从网络加载。

  2. LOAD_CACHE_ONLY

    不要使用网络负载仅从缓存。

  3. LOAD_DEFAULT

    默认的缓存使用模式

  4. LOAD_NORMAL

    正常高速缓存使用模式

  5. LOAD_NO_CACHE

    不要使用缓存,负载从网络


我不知道你是否能子类的WebView以获得所需的流量。


+0

对不起忘了提,我编辑我的问题.. – Marty

+0

@Marty做你试图改变LOAD_DEFAULT到LOAD_NORMAL –

+0

仍然只是具有通用的“找不到网页”的消息时,网络连接发生故障时,我使用LOAD_NORMAL – Marty

1

这岂不是工作,如果你只是让浏览器处理呢?指定清单在这样的HTML标签:

<html manifest="mycache.appcache"> 

...当没有可用的连接,浏览器会自动使用它,你不应该需要在所有更改任何设置。

0

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

完蛋了在您的网页开启正常版本在并保存在缓存中,如果您的网络关闭那么它会自动在缓存版本中打开