我的布局中有一个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中解决此问题?
答案 0 :(得分:59)
在大多数情况下,此错误实际上源于您的应用程序之外(偶尔它只是缺少INTERNET
权限,但这听起来不像这里的情况。)
我正在输入一个解释,但发现了一个更简单的例子,它在this answer to another question中兼作一个解释。这里有相关的部分,重新调整一下:
no-cache
的确认/收据页面,这意味着它将始终从服务器请求。问题出在最后一步。确认页面标有no-cache
,因此必须再次从服务器请求。但要正确显示相同的页面,第一次传递的相同数据需要再次发送。
这导致Joe被计费两次,因为正在使用与上次相同的信息进行新请求。乔在他的帐户上发现了两项指控,并在他的家门口发现了一对额外的帐篷时,乔将不会是一个快乐的露营者。
似乎这种情况很常见,现在它已成为大多数浏览器的标准错误,显然是新版本的Android。该错误实际上源自Chromium,这就是为什么您会在Google Chrome中看到相同的错误,以及为什么您只在4.4中看到它(它引入了新版本的WebView based on Chromium)。
事实上,您之前实际上可能已经看到了它,它是大多数浏览器中显示的消息,警告您有一些类似于&#34的内容;要刷新此页面,浏览器必须重新发送数据... yada yada yada"。
这是Android 4.4的方式,警告你发生了什么。如何修复它实际上取决于你所连接的内容,但是如果你搜索这种情况,你会发现它很常见,并且有修复。错误的确切触发实际上是在无法从缓存中提供请求的时候(在这种情况下,no-cache
导致该问题)。
根据请求的性质,可能no-cache
实际上并不需要。
但是从您的应用程序的角度来看,主要的问题是,onReceiveError
是一种最后的手段"用于WebView。您从那里获得的错误已从底层系统传播。一旦你到达那里,你就不能继续加载的页面。因此,您没有机会允许重新发送,并且您无法向用户提供该选项,这与谷歌浏览器不同。
答案 1 :(得分:29)
我遇到了同样的问题,因为在我的清单文件夹中,我获得了互联网权限:
我有(错误)
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
应该有(没有错误)
<uses-permission android:name="android.permission.INTERNET"/>
答案 2 :(得分:14)
使用
if (Build.VERSION.SDK_INT >= 19) {
mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
它将修复WebView中的ERR_CACHE_MISS。 也许你需要在一些Lollipop WebView更新后将其更改为SDK_INT == 19,但它现在可以使用。
答案 3 :(得分:0)
你的andriodManifest.xml文件中的这个权限
<uses-permission android:name="android.permission.INTERNET"/>