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'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); } } 

Я также установил 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?

Solutions Collecting From Web of "Android 4.4 дает ошибку ERR_CACHE_MISS в onReceivedError для WebView назад"

Эта ошибка в большинстве случаев возникает из-за пределов приложения (иногда это просто отсутствие разрешения INTERNET , но это не похоже на случай здесь).

Я печатал объяснение, но нашел гораздо более простой пример, который удваивается как объяснение в этом ответе на другой вопрос . Вот соответствующие биты, немного переделанные:

  1. Джо заполняет форму заказа с информацией о своей кредитной карте
  2. Сервер обрабатывает эту информацию и возвращает страницу подтверждения / получения, отмеченную no-cache в заголовке, что означает, что она всегда будет запрашиваться с сервера.
  3. Джо идет на другую страницу.
  4. Джо нажимает на кнопку, потому что хочет дважды проверить что-то, переведя его на страницу подтверждения.

Проблема возникает из этого последнего шага. Страница подтверждения была отмечена no-cache , поэтому ее необходимо снова запросить с сервера. Но чтобы показать ту же страницу правильно, те же самые данные, которые были переданы в первый раз, нужно снова отправить.

Это приводит к тому, что Джо получает счет дважды, так как новый запрос делается с той же информацией, что и в прошлый раз. Джо не будет счастливым кемпером, когда он найдет два обвинения на его счету и дополнительную пару палаток на его пороге.

Похоже, эта ситуация была достаточно распространена, что теперь она является стандартной ошибкой для большинства браузеров и, по-видимому, более новых версий Android. Ошибка на самом деле происходит от Chromium, поэтому вы увидите ту же ошибку в Google Chrome и почему ее видите только в 4.4 (в которой была введена новая версия WebView на основе Chromium ).

Фактически, вы, вероятно, видели это раньше, это сообщение, появившееся в большинстве браузеров, предупреждает вас о чем-то вроде строки «Чтобы обновить эту страницу, браузеру придется пересылать данные … yada yada yada».

Это способ Android 4.4, предупреждающий вас о том, что происходит. Как исправить это действительно зависит от того, к чему вы подключаетесь, но если вы ищете эту ситуацию, вы обнаружите, что она довольно распространена и имеет исправления. Точный триггер ошибки на самом деле возникает, когда запрос не может обслуживаться из кеша (в этом случае no-cache вызывает это).

В зависимости от характера запроса, возможно, no-cache не нужен.

Но с точки зрения вашего приложения основная проблема заключается в том, что onReceiveError является своего рода «последним средством» для WebView. Ошибки, которые вы получили, распространились из базовой системы. И как только вы окажетесь там, вы не сможете продолжить загрузку страницы в ее нынешнем виде . Таким образом, у вас нет возможности разрешить повторную отправку, и вы не можете предоставить пользователю эту опцию, в отличие от Google Chrome.

Я столкнулся с той же проблемой, потому что в моей папке манифеста у меня было разрешено использование Интернета:

У меня была (ошибка)

 <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); } 

Он установит ERR_CACHE_MISS в WebView. Возможно, вам придется изменить его на SDK_INT == 19 после некоторых обновлений Lollipop WebView, но он работает пока.