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?


person dev_android    schedule 04.09.2014    source источник


Ответы (4)


На самом деле эта ошибка в большинстве случаев возникает за пределами вашего приложения (иногда это просто отсутствующее разрешение 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.

person Selali Adobor    schedule 16.09.2014

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

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

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

Должно быть (без ошибок)

<uses-permission android:name="android.permission.INTERNET"/>
person codebyjames    schedule 21.07.2015
comment
это удаляет сообщение об ошибке, но это странно, поскольку автозаполнение в Studio использует UC, как и ваш первый пример. - person David Douglas; 08.08.2015
comment
То же самое, очень странное поведение Studio. - person wzieba; 09.08.2015

Использовать

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

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

person romashko_o    schedule 12.12.2014
comment
В итоге я использовал LOAD_NO_CACHE вместо LOAD_CACHE_ELSE_NETWORK. Та же концепция, но LOAD_CACHE_ELSE_NETWORK говорит, что использует кешированные ресурсы, даже если срок их действия истек, и мне это не понравилось. - person craigrs84; 01.04.2015

это разрешение в вашем файле andriodManifest.xml

 <uses-permission android:name="android.permission.INTERNET"/>
person Sai Gopi Me    schedule 17.10.2017