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

我在我的布局有一个webview。 默认情况下,在其中打开search表单。 在search时,search表单下方会显示一个列表部分。 如果列表中的任何链接被点击,则打开详细信息页面。 现在我想控制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。 当我回到使用后退button,它工作正常的任何版本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中解决这个问题?

在大多数情况下,这个错误实际上源于你的应用程序之外(偶尔它只是一个缺less的INTERNET许可,但是这听起来不像这里的情况)。

我正在input一个解释,但是find了一个更简单的例子, 这个例子可以解释另一个问题的答案 。 下面是相关的部分,重新​​进行了一些修改:

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

问题出现在最后一步。 确认页面被标记为no-cache ,所以必须再次从服务器请求。 但要正确显示相同的页面,首次传送的相同数据需要重新发送。

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

看起来这种情况已经足够普遍,现在在大多数浏览器中都是一个标准错误,显然是Android的新版本。 这个错误实际上源于Chromium,这就是为什么你会在Google Chrome浏览器中看到同样的错误,为什么你只能在4.4中看到它(它引入了基于Chromium的WebView的新版本)。

事实上,你之前可能已经看到过,这是大多数浏览器显示的信息,警告你“按照刷新这个页面,浏览器将不得不重新发送数据… yada yada yada”。

这是Android 4.4的方式警告你正在发生的事情。 如何解决这个问题真的取决于你连接的是什么,但是如果你search这种情况,你会发现这是相当普遍的,并且有修复。 确切的错误触发器实际上是当请求不能从caching服务(在这种情况下, no-cache造成的)。

根据请求的性质,可能no-cache实际no-cache

但从应用程序的angular度来看,主要的问题是, onReceiveError是WebView的一种“最后的手段”。 你得到的错误已经从底层系统传播出去了。 一旦你到达那里,你不能继续页面加载。 所以你没有机会允许重新发送,而不像谷歌浏览器那样给用户这个select。

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

我有(错误)

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

应该有(没有错误)

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

使用

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

它将修复WebView中的ERR_CACHE_MISS。 在一些Lollipop WebView更新之后,也许你需要把它改成SDK_INT == 19,但是现在它可以工作。

这个权限在你的andriodManifest.xml文件中

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