Android 4.4 возвращает ошибку ERR_CACHE_MISS в onReceivedError for WebView назад

Фактически он вызывает функцию f для каждого аргумента в args в неуказанном порядке.

[](...){}

создает лямбда-функцию, которая ничего не делает и получает произвольное количество аргументов (va args).

((f(std::forward(args)), 0)...)

аргумент lambda.

(f(std::forward(args)), 0)

вызывать f с переадресованным аргументом, отправить 0 в lambda.

Если вы хотите, чтобы указанный заказ вы можете использовать следующее: :

using swallow = int[];
(void)swallow{0, (f(std::forward(args)), 0)...};

29
задан dev_android 4 September 2014 в 11:18
поделиться

4 ответа

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

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

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

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

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

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

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

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

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

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

59
ответ дан Community 4 September 2014 в 11:18
поделиться

Используйте

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

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

14
ответ дан romashko_o 4 September 2014 в 11:18
поделиться

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

 <uses-permission android:name="android.permission.INTERNET"/>
0
ответ дан saigopi 4 September 2014 в 11:18
поделиться

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

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

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

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

<uses-permission android:name="android.permission.INTERNET"/>
29
ответ дан codebyjames 4 September 2014 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: