【问题标题】:displaying cached version of webview in android在android中显示缓存的webview版本
【发布时间】: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);

【问题讨论】:

    标签: android html webview offline-caching offline-mode


    【解决方案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

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

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

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

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

    <html manifest="mycache.appcache">
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 2011-09-01
      • 2012-02-26
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多