在android中显示缓存的webview版本

Posted

技术标签:

【中文标题】在android中显示缓存的webview版本【英文标题】:displaying cached version of webview in android 【发布时间】:2012-01-18 01:46:38 【问题描述】:

我正在尝试让网站的 html5 离线缓存版本在 web 视图内的网络出现故障时显示。

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

如何让它显示页面的 HTML5 缓存版本? webapp 的离线存储绝对可以正常工作,因为它在桌面版本的 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);

【问题讨论】:

【参考方案1】:

尝试使用

找出网络状态
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(...)

【讨论】:

这可能是“最干净”的解决方案,所以我给你赏金点:)【参考方案2】:

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


这很奇怪..根据documentation:

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

但是您想要的行为似乎不是以下之一:

    LOAD_CACHE_ELSE_NETWORK

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

    LOAD_CACHE_ONLY

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

    LOAD_DEFAULT

    默认缓存使用模式

    LOAD_NORMAL

    正常的缓存使用模式

    LOAD_NO_CACHE

    不使用缓存,从网络加载


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


【讨论】:

@Marty 您是否尝试将 LOAD_DEFAULT 更改为 LOAD_NORMAL 当我使用 LOAD_NORMAL 时网络连接断开时,仍然只有通用的“网页不可用”消息 我创建了一个“解决方法”,在其中加载 LOAD_NO_CACHE 版本,如果失败,则在 onReceivedError 中加载 LOAD_CACHE_ONLY 版本.. 我有这个工作,但它是一个相当狡猾的工作,我是希望有一个干净的解决方案。它有点傻,它没有对此的原生支持.. 我认为一个好的解决方案是使用 LOAD_NORMAL 和 onReceivedError Navigate BACK。我认为这将根据文档加载缓存(不确定我是否记错了),但要小心不要陷入无限循环【参考方案3】:

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

<html manifest="mycache.appcache">

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

【讨论】:

以上是关于在android中显示缓存的webview版本的主要内容,如果未能解决你的问题,请参考以下文章

检查文件是不是已经存在于webview缓存android中

Android Studio,在新活动中显示完整的 WebView

android system webview是啥

Android 仅加载缓存不起作用。离线显示 WebView

Android WebView 不缓存 HTTPS 内容

Android WebView loadData读取两次才能显示的问题