Android 4.4 дает ошибку ERR_CACHE_MISS в onReceivedError для 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 history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
// If it wasn't the Back key or there 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);
}
}
Я также установил WebViewClient с WebView. Когда я возвращаюсь с помощью кнопки "Назад", он отлично работает для любой версии 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?
Ответы
Ответ 1
В большинстве случаев эта ошибка возникает из-за пределов приложения (иногда это просто недостающее разрешение INTERNET
, но это не похоже на этот случай).
Я печатал объяснение, но нашел гораздо более простой пример, который удваивается как объяснение в этом ответе на другой вопрос. Здесь соответствующие биты немного переделаны:
- Джо заполняет форму заказа с информацией о своей кредитной карте.
- Сервер обрабатывает эту информацию и возвращает страницу подтверждения/получения, отмеченную
no-cache
в заголовке, что означает, что она всегда будет запрашиваться с сервера.
- Джо переходит на другую страницу.
- Джо нажимает на кнопку, потому что хочет дважды проверить что-то, переведя его на страницу подтверждения.
Проблема возникает из этого последнего шага. Страница подтверждения была отмечена no-cache
, поэтому ее нужно снова запросить с сервера. Но чтобы показать ту же страницу правильно, те же самые данные, которые были переданы в первый раз, должны снова отправляться.
Это приводит к тому, что Джо получает счет дважды, так как новый запрос делается с той же информацией, что и в прошлый раз. Джо не будет счастливым туристом, когда он найдет два заряда на его счет и дополнительные пару палаток на его пороге.
Кажется, эта ситуация была достаточно распространена, что теперь она является стандартной ошибкой для большинства браузеров и, по-видимому, более новых версий Android. Ошибка на самом деле происходит из Chromium, поэтому вы увидите ту же ошибку в Google Chrome и почему ее видите только в 4.4 (в которой была введена новая версия WebView на основе Chromium).
Фактически, вы, вероятно, видели это раньше, это сообщение, появившееся в большинстве браузеров, предупреждает вас о чем-то вроде строки "Чтобы обновить эту страницу, браузеру придется пересылать данные... yada yada yada".
Это Android 4.4, предупреждающий вас о том, что происходит. Как исправить это действительно зависит от того, к чему вы подключаетесь, но если вы ищете эту ситуацию, вы обнаружите, что она довольно распространена и имеет исправления. Точный триггер ошибки на самом деле, когда запрос не может обслуживаться из кеша (в этом случае это вызывает no-cache
).
В зависимости от характера запроса, возможно, no-cache
на самом деле не требуется.
Но с точки зрения вашего приложения основная проблема заключается в том, что onReceiveError
является своего рода "последним средством" для WebView. Ошибки, которые вы получили, распространились из базовой системы. И как только вы окажетесь там, вы не сможете продолжить загрузку страницы в ее нынешнем виде. Таким образом, у вас нет возможности разрешить повторную отправку, и вы не можете предоставить пользователю эту опцию, в отличие от Google Chrome.
Ответ 2
Я столкнулся с той же проблемой, потому что в моей папке манифеста у меня было разрешено использование Интернета:
У меня была (ошибка)
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
Должна иметь (без ошибок)
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
Ответ 3
Используйте
if (Build.VERSION.SDK_INT >= 19) {
mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
Он установит ERR_CACHE_MISS в WebView.
Возможно, вам придется изменить его на SDK_INT == 19 после некоторых обновлений Lollipop WebView, но он работает пока.
Ответ 4
это разрешение в файле andriodManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>