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

dev*_*oid 30 android webview chromium webviewclient

我的布局中有一个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);
       }

}
Run Code Online (Sandbox Code Playgroud)

我还使用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
Run Code Online (Sandbox Code Playgroud)

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

Sel*_*bor 58

在大多数情况下,此错误实际上源于您的应用程序之外(偶尔它只是一个缺少INTERNET权限,但这听起来不像这里的情况).

我正在输入一个解释,但发现了一个更简单的例子,在另一个问题的答案中兼作一个解释.这是相关的位,重新调整了一下:

  1. 乔用他的信用卡信息填写订单
  2. 服务器处理该信息并返回no-cache在标题中标记的确认/收据页面,这意味着它将始终从服务器请求.
  3. 乔去了另一页.
  4. Joe点击回来是因为他想要仔细检查一下,把他带到确认页面.

这个问题来自最后一步.确认页面已标记为no-cache,因此必须再次从服务器请求.但要正确显示相同的页面,第一次传递的相同数据需要再次发送.

这导致Joe被计费两次,因为正在使用与上次相同的信息进行新请求.当乔在他的帐户上发现两项指控并在他家门口发现一对额外的帐篷时,乔将不会是一个快乐的露营者.

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

实际上,您之前可能已经看过它,它是大多数浏览器中显示的消息,警告您的内容为"要刷新此页面,浏览器必须重新发送数据... yada yada yada".

这是Android 4.4的方式,警告你发生了什么.如何修复它取决于你所连接的内容,但是如果你搜索这种情况,你会发现它很常见,并且有修复.错误的确切触发实际上是在无法从缓存中提供请求时(在这种情况下,no-cache导致该问题).

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

但从您的应用程序的角度来看,主要问题是,onReceiveErrorWebView是一种"最后的手段".您从那里获得的错误已从底层系统传播.一旦你在那里结束,你不能继续在页面加载,因为它主张.因此,您没有机会允许重新发送,并且您无法向用户提供该选项,这与谷歌Chrome浏览器不同.


cod*_*mes 31

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

我有(错误)

<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)

应该有(没有错误)

<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)


小智 14

使用

if (Build.VERSION.SDK_INT >= 19) {
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    }
Run Code Online (Sandbox Code Playgroud)

它将修复WebView中的ERR_CACHE_MISS.也许你需要在一些Lollipop WebView更新后将其更改为SDK_INT == 19,但它现在可以使用.