【问题标题】:Find out if Android WebView is showing cached page查看 Android WebView 是否显示缓存页面
【发布时间】:2011-09-01 19:22:33
【问题描述】:

我正在制作一个 Android 应用程序,其中包括在 web 视图中显示网站。据我了解,如果无法建立连接,webview 会自动显示页面的缓存版本。

有什么方法可以查出显示的页面是从服务器还是缓存中获取的?

甚至可能缓存页面的年龄。

这是为了能够在用户查看旧信息时通知用户。

【问题讨论】:

    标签: android caching webview


    【解决方案1】:

    您可以尝试破解 - 首先将 WebView 的 cache mode 设置为 WebSettings.NO_CACHE 并加载 URL。然后,像这样创建一个自定义 WebChromeClient:

    final String urlToLoad = "http://www.my-url.com"; 
    webview.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl)
        {
            if (view.getSettings().getCacheMode() == WebSettings.LOAD_NO_CACHE && urlToLoad.equals(failingUrl))
            {
                view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
                view.loadUrl(urlToLoad);
                return;
            }
            else
            if (urlToLoad.equals(failingUrl))
            {
                // cache failed as well, load a local resource as last resort
                // or inform the user
            }
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    });
    webview.loadUrl(urlToLoad);
    

    【讨论】:

    • 这仍然是一个 hack。为什么无法检查给定 URL 是否存在缓存?编辑:如果存在缓存,为什么 Android 会调用 onReceivedError()?
    • 它只有在您首先设置“WebSettings.LOAD_DEFAULT”时才有效。因为如果您首先设置 WebSettings.NO_CACHE,即使成功加载,网页也永远不会保存到缓存中。 (注意::还将“onReceivedError”中的 if 条件更新为 view.getSettings().getCacheMode() == WebSettings.LOAD_DEFAULT && urlToLoad.equals(failingUrl))
    【解决方案2】:

    由于 WebView 像浏览器一样工作,所以答案是否定的。 有一些 hacky 方法可以检测这种情况。

    或者另一种解决方案是防止页面被缓存(请参阅 WebView 文档)

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 1970-01-01
      • 2012-05-18
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多