在安卓中显示Webview的缓存版本

11

我正在尝试在 WebView 中,在网络断开时显示网站的 HTML5 离线缓存版本。

我已经成功地重写了 onReceivedError 方法,当网络断开时,该方法被调用。但问题在于,它只显示了常规的“网页无法访问”的消息。

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

我知道我可以在 onReceivedError 中手动调用 loadData 将数据加载到视图中,但我不确定从哪里获取 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);
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(...)

这可能是最“干净”的解决方案,所以我会给你赏金点数 :) - Marty

2
我认为一个好的解决方案是使用LOAD_NORMAL和onReceivedError导航回去。我认为这将根据文档加载缓存(不确定我是否记得正确),但要小心不要陷入无限循环。
这很奇怪...根据文档
覆盖缓存的使用方式。缓存的使用方式基于导航选项。对于正常页面加载,检查缓存并根据需要重新验证内容。当返回导航时,不重新验证内容,而是直接从缓存中获取内容。此函数允许客户端覆盖此行为。
然而,您想要的行为似乎不属于其中之一。
  1. LOAD_CACHE_ELSE_NETWORK

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

  2. LOAD_CACHE_ONLY

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

  3. LOAD_DEFAULT

    默认缓存使用模式

  4. LOAD_NORMAL

    正常的缓存使用模式

  5. LOAD_NO_CACHE

    不使用缓存,从网络加载


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

@Marty 你试过将 LOAD_DEFAULT 改为 LOAD_NORMAL 吗? - Sherif elKhatib
当我使用LOAD_NORMAL时,即使网络连接断开,仍然只显示通用的“网页不可用”消息。 - Marty
我创建了一个“变通方法”,其中我加载LOAD_NO_CACHE版本,如果失败,则在onReceivedError中加载LOAD_CACHE_ONLY版本。我已经让它工作了,但这是一个相当不可靠的解决方案,我希望有一个更干净的解决方案。这有点傻,它没有本地支持。 - Marty
我认为一个好的解决方案是使用LOAD_NORMAL和onReceivedError Navigate BACK。我认为这将根据文档加载缓存(不确定我是否记得正确),但要小心不要陷入无限循环。 - Sherif elKhatib

1

如果你简单地让浏览器处理它,它不起作用吗?像这样在HTML标记中指定清单:

<html manifest="mycache.appcache">

...并且当没有可用的连接时,浏览器应该自动使用它,您无需更改任何设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接