Подтвердить что ты не робот

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?

4b9b3361

Ответ 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"/>