11

我正在尝试让网站的 HTML5 离线缓存版本在网络在 web 视图内关闭时显示。

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

如何让它显示页面的 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

3 回答 3

6

尝试使用找出网络状态

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

检测Android上是否有可用的互联网连接

这也需要

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在你的 AndroidManifest.xml

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

webview.getSettings().setCacheMode(...)
于 2011-12-20T10:01:19.390 回答
2

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


这很奇怪..根据文档

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

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

  1. LOAD_CACHE_ELSE_NETWORK

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

  2. LOAD_CACHE_ONLY

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

  3. 加载默认值

    默认缓存使用模式

  4. 加载正常

    正常的缓存使用模式

  5. LOAD_NO_CACHE

    不使用缓存,从网络加载


我不知道您是否可以对 WebView 进行子类化以获得所需的流程。


于 2011-12-14T08:48:46.287 回答
1

如果您只是让浏览器处理它,它不起作用吗?在 HTML 标记中指定清单,如下所示:

<html manifest="mycache.appcache">

...并且浏览器应该在没有可用连接时自动使用它,您根本不需要更改任何设置。

于 2011-12-20T13:52:28.633 回答