Android 4.4 在 WebView 返回的 onReceivedError 中给出ERR_CACHE_MISS错误

Android 4.4 giving ERR_CACHE_MISS error in onReceivedError for WebView back

提问人:dev_android 提问时间:9/4/2014 更新时间:4/12/2020 访问量:61502

问:

我的布局中有一个 Web 视图。默认情况下,将在其中打开一个搜索表单。在搜索时,搜索表单下方会出现一个列表部分。如果单击列表中的任何链接,则会打开详细信息页面。现在我想控制 Web 视图的后退导航。我把这段代码放在了 Activity 中。

    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {

            Log.d("TYPE", TYPE);

            WebView myWebView = null;
            if (TYPE.equalsIgnoreCase("REPORT_ACTIVITY"))
                myWebView = reportView;

            if (TYPE.equalsIgnoreCase("FEEDBACK_ACTIVITY"))
                myWebView = feedbackView;

            if (myWebView != null)
                // Check if the key event was the Back button and if there's history
                if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
                    myWebView.goBack();
                    return true;
                }
            // If it wasn't the Back key or there's no web page history, bubble up
            // to the default
            // system behavior (probably exit the activity)
            return super.onKeyDown(keyCode, event);
        }

private WebViewClient webViewClient = new WebViewClient() {
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.d("onPageStarted", "onPageStarted");
            loadProgressBarBox.setVisibility(View.VISIBLE);
            //view.setVisibility(View.GONE);
        }

        public void onPageFinished(WebView view, String url) {
            Log.d("onPageFinished", "onPageFinished");
            loadProgressBarBox.setVisibility(View.GONE);
        }

        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {

            Log.d("Error", "Error code: " + errorCode + "/" + description);
       }

}

我还使用 WebView 设置了一个 WebViewClient。当我使用后退按钮返回时,它适用于任何版本 4.4。但是当我在 Android 4.4 中尝试时,它从详细信息页面到列表页面都恢复正常。但是一旦我尝试再次返回,它就会抛出错误代码 -1 并在描述中ERR_CACHE_MISS。不显示任何页面。

09-04 06:59:05.666: D/Error(1102): Error code: -1/net::ERR_CACHE_MISS

如何在Android 4.4中解决这个问题?

Android Chromium WebView客户端

评论


答:

61赞 Selali Adobor 9/16/2014 #1

在大多数情况下,此错误实际上源于应用程序外部(有时它只是缺少权限,但这里听起来不像这种情况)。INTERNET

我正在输入一个解释,但发现了一个更直接的例子,可以作为另一个问题的答案中的解释。以下是相关的位,重新散列了一下:

  1. Joe 用他的信用卡信息填写了订单
  2. 服务器处理该信息并返回标头中标记的确认/收据页面,这意味着将始终从服务器请求该信息。no-cache
  3. Joe 转到另一页。
  4. Joe 点击返回,因为他想仔细检查一些东西,将他带到确认页面。

问题出在最后一步。确认页面标有 ,因此必须再次向服务器请求。但是,要正确显示同一页面,需要再次发送第一次传递的相同数据。no-cache

这会导致 Joe 收到两次账单,因为使用与上次相同的信息发出新请求。当乔发现他的账户上有两笔费用和家门口有一对额外的帐篷时,他不会是一个快乐的露营者。

这种情况似乎很常见,以至于它现在是大多数浏览器的标准错误,显然,新版本的 Android 也是如此。该错误实际上源于 Chromium,这就是为什么您会在 Google Chrome 中看到相同的错误,以及为什么您只在 4.4 中看到它(它引入了基于 Chromium 的新版本 WebView)。

事实上,您实际上可能已经看过它了,这是大多数浏览器中显示的消息,警告您“要刷新此页面,浏览器将不得不重新发送数据......雅达雅达雅达”。

这是 Android 4.4 警告您正在发生的事情的方式。如何修复它实际上取决于你要连接的内容,但如果你搜索这种情况,你会发现它相当普遍,并且有修复。错误的确切触发器实际上是当无法从缓存中处理请求时(在本例中,是导致这种情况的原因)。no-cache

根据请求的性质,实际上可能并不需要。no-cache

但从应用程序的角度来看,主要问题是,WebView 是某种“最后的手段”。您到达那里的错误已从底层系统传播。一旦你结束了,你就无法继续页面加载。因此,您没有机会允许重新发送,并且您不能为用户提供该选项,这与Google Chrome浏览器不同。onReceiveError

评论

0赞 9/2/2021
很好的解释,但我没有看到 OP 问题的解决方案
15赞 romashko_o 12/13/2014 #2

if (Build.VERSION.SDK_INT >= 19) {
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    }

它将修复 WebView 中的ERR_CACHE_MISS。 也许在一些 Lollipop WebView 更新后,您需要将其更改为 SDK_INT == 19,但它现在有效。

评论

1赞 craigrs84 4/2/2015
我最终用了LOAD_NO_CACHE而不是LOAD_CACHE_ELSE_NETWORK。相同的概念,但LOAD_CACHE_ELSE_NETWORK说它使用缓存的资源,即使它们已过期,这对我来说听起来并不好。
31赞 Papa Yev 7/22/2015 #3

我遇到了同样的问题,因为在我的清单文件夹中,我的 Internet 权限大写:

我有(错误)

<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>

应该有(没有错误)

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

评论

0赞 David Douglas 8/8/2015
这将删除错误消息,但这很奇怪,因为 Studio 中的自动完成像您的第一个示例一样使用 UC。
0赞 wzieba 8/9/2015
同样在这里,Studio 的行为非常奇怪。
0赞 saigopi.me 10/17/2017 #4

andriodManifest.xml 文件中的此权限

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