在android中显示webview的缓存版本



我正在尝试获得一个网站的HTML5离线缓存版本,以显示当网络在webview内部下降。

我已经覆盖了onReceivedError ok,当网络关闭时,这个方法被调用。问题是它显示一般的"网页不可用"消息。

我怎样才能让它显示网页的HTML5缓存版本?web应用程序的离线存储肯定是有效的,因为它在桌面版本的Firefox和Chrome中运行良好。

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

注意:如果我在loadData中设置一些虚拟数据,例如view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8");,然后单击back(通过检测back事件并调用webview.goBack();),则页面的缓存版本显示ok。

下面是我添加的一些代码行来设置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);

尝试使用

查看网络状态
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

现在您可以将缓存行为设置为LOAD_CACHE_ONLY或LOAD_NO_CACHE,具体取决于网络连接是否可用,使用

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

我认为一个很好的解决方案是使用LOAD_NORMAL和onReceivedError导航BACK。我认为这将加载缓存根据文档(不确定如果我记得正确),但要小心不要陷入无限循环


这很奇怪…根据文档:

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

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

  1. LOAD_CACHE_ELSE_NETWORK

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

  2. LOAD_CACHE_ONLY

    不使用网络,只从缓存加载

  3. LOAD_DEFAULT

    默认缓存使用模式

  4. LOAD_NORMAL

    正常缓存使用模式

  5. LOAD_NO_CACHE

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


我不知道你是否可以子类化WebView来获得所需的流程。


如果让浏览器来处理,它会不会工作呢?在HTML标签中指定manifest,如下所示:

<html manifest="mycache.appcache">

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

相关内容

  • 没有找到相关文章

最新更新