Android 4.4中WebView返回时出现ERR_CACHE_MISS错误

31

我在我的布局中有一个Webview。默认情况下,它会打开一个搜索表单。搜索后,列表部分会出现在搜索表单下方。如果单击列表中的任何链接,则会打开详细信息页面。现在我想控制Webview的后退导航。我将此代码放置在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中解决此问题?
4个回答

61
在大多数情况下,这个错误实际上源于您的应用程序之外(偶尔是缺少“INTERNET”权限,但这似乎不是这种情况)。我正在打出一份说明,但发现另一个问题的this answer to another question有一个更直接的例子,也可以作为解释。以下是相关部分,稍微重新整理了一下:
1. Joe填写订单表格并提供信用卡信息 2. 服务器处理该信息并返回带有标题中标记为“no-cache”的确认/收据页面,表示它将始终从服务器请求。 3. Joe转到另一页。 4. Joe点击“后退”按钮,因为他想再次检查某些内容,导致他返回到确认页面。
问题出在最后一步。确认页面被标记为“no-cache”,因此必须再次从服务器请求。但是为了正确显示相同的页面,需要再次发送第一次传递的相同数据。
这将导致Joe被双重计费,因为使用与上次相同的信息进行了新的请求。当他发现账户上有两笔费用和额外的帐篷时,Joe会很不高兴。
似乎这种情况很常见,现在成为大多数浏览器以及最新版本的Android的标准错误。实际上,该错误来自于Chromium,这就是为什么你会在Google Chrome中看到相同的错误,以及为什么只在4.4中看到它(引入了基于Chromium的新版本WebView )。
实际上,你可能以前已经看到过它,在大多数浏览器中警告你刷新页面时出现的消息类似于“要刷新此页面,浏览器必须重新发送数据...等等”。
这是Android 4.4警告你正在发生的事情的方式。如何修复它实际上取决于你连接到的内容,但如果你搜索这种情况,你会发现它非常普遍,并且有解决方法。实际触发错误的确切原因是请求无法从缓存中服务(在这种情况下,no-cache导致了这个问题)。
根据请求的性质,也许实际上不需要使用“no-cache”。但是从您的应用程序的角度来看,主要问题是“onReceiveError”是WebView的一种“最后的手段”。您在那里收到的错误已经从底层系统传播开来。一旦您到达那里,您就无法按照原样继续页面加载。因此,您没有机会允许重新发送,并且不能像Google Chrome那样为用户提供该选项。

非常好的解释,但我没有看到对OP问题的解决方案。 - user2587965

31

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

我写成了 (error)

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

应该没有错误

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

这样做可以消除错误信息,但是这很奇怪,因为Studio中的AutoComplete使用的是UC,就像你第一个例子一样。 - David Douglas
同样的问题,Studio 的行为非常奇怪。 - wzieba

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

它将修复WebView中的ERR_CACHE_MISS错误。 也许在一些棒棒糖WebView更新后,你需要将其更改为SDK_INT == 19,但目前有效。


1
我最终使用了LOAD_NO_CACHE而不是LOAD_CACHE_ELSE_NETWORK。虽然概念相同,但LOAD_CACHE_ELSE_NETWORK表示即使缓存过期也会使用缓存资源,这听起来对我来说并不好。 - craigrs84

0

在你的 AndroidManifest.xml 文件中添加这个权限

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

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