Как обрабатывать внутреннюю ошибку сервера с помощью Android WebView?

Я использую onReceivedError для перехвата любых ошибок при загрузке веб-просмотра. Поскольку наша веб-страница имеет Internal Server Error, а все приложение основано на веб-просмотре (без встроенной навигации), оно будет выглядеть так:

Пример скриншота

Таким образом я перехватываю ошибки:

    @SuppressLint("NewApi")
    public void onReceivedError(final WebView view, WebResourceRequest request, final WebResourceError error) {
        Log.d(TAG, "HTTP error " + error.getErrorCode() + " ---> " + error.getDescription());
        int err = error.getErrorCode();
        if (err == -2) {
            view.loadUrl("about:blank");
            view.loadUrl("file:///android_asset/de_offline.html");
        } else {
            view.reload();
        }
    }

Почему приложение не распознало этот Internal Server Error? Он распознает, если нет подключения к Интернету.

Но эта ошибка как бы уничтожает все приложение, потому что этот экран не исчезнет, ​​даже если веб-страница вернется в онлайн. Это означает, что я вынужден от setAppCacheEnabled до false.

Я предполагаю, что это потому, что он хранится в кеше или отсутствует кнопка перезагрузки. Но поскольку мы находимся на общем хостере, мы не можем добавить кнопку перезагрузки на эту страницу ошибки html.

Даже если я полностью закрою приложение и снова запущу его, эта ошибка будет отображаться.

Единственным вариантом для пользователя будет удаление приложения или удаление кеша вручную, но я не думаю, что кто-то сделает это или в большинстве случаев не знает об этом.

Итак, мой вопрос: почему onReceivedError вместо этого даже не загрузил html-страницу локального актива de_offline.html? Должен ли я перехватывать в какой-то момент раньше и какой метод или где это будет?


person Alexio    schedule 01.04.2017    source источник


Ответы (1)


Убедитесь, что страница ошибки не отвечает кодом состояния HTTP 200. На ошибки сервера следует отвечать кодами состояния HTTP-5xx. Я подозреваю, что WebView получает HTTP 2xx и «думает», что ответ в порядке, поэтому ваша обработка ошибок не выполняется.

Ссылка: Список кодов состояния HTTP и их значение

Изменить: я только что просмотрел: WebViewClient — код ошибки Откуда Я вижу, что это описывает совершенно другой набор ошибок. Но почему?

Другое редактирование: О боже... какого черта?! Насколько я вижу, нет способа получить коды состояния HTTP в WebView?! Это вне меня. Все, что я мог получить, это обходной путь Как проверить из Android WebView, что страница не найдена с ошибкой 404?. Адаптируйте это для внутренних ошибок сервера (если применимо, используйте метод из Android SDK API уровня 23, где был добавлен onReceivedHttpError)

person sschrass    schedule 01.04.2017
comment
Я понимаю. Так может быть, что сама страница с ошибкой 500 интерпретируется как действительная безошибочная страница для Android, потому что это просто действительный html? - person Alexio; 01.04.2017
comment
Я не это имел в виду, страницу с ошибкой можно было обслуживать как обычную. Браузер отличает ошибку от обычной по коду состояния. Сам код состояния устанавливается сервером, который решает, является ли возвращенный HTML обычным или страницей с ошибкой. Оба должны быть действительным HTML в любом случае. - person sschrass; 01.04.2017