Android WebView onReceivedError () - PullRequest
       12

Android WebView onReceivedError ()

32 голосов
/ 15 февраля 2011

Кто-нибудь знает, есть ли способ перехватить «страницу не найдена» или «ошибка загрузки страницы» в WebView?

Согласно документации Android, onReceivedError() должен быть в состоянии перехватить. но я проверил это в приложении, которое я произвольно дал неправильный URL, и он ничего не сделал.

Я хочу, чтобы мое приложение могло выдавать собственное сообщение об ошибке, если URL по какой-либо причине недоступен.

это код, который ничего не делал:

public void onReceivedError(WebView view, int errorCode,
        String description, String failingUrl) {

    // custom error handling ... show and alert or toast or something
}

Ответы [ 4 ]

29 голосов
/ 15 февраля 2011

Согласно документации и моему опыту, она должна работать вполне нормально.Вам просто нужно установить WebClient с переопределенным методом onReceivedError в вашем WebView.

Вот фрагмент из моего старого тестового приложения:

 WebView wv = (WebView) findViewById(R.id.webView);
 wv.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.i("WEB_VIEW_TEST", "error code:" + errorCode);
            super.onReceivedError(view, errorCode, description, failingUrl);
    }
 });

Я тестировалэто и работает вполне нормально.Проверьте свои журналы и посмотрите, какой код ошибки вы получаете.Надеюсь, это поможет.

11 голосов
/ 14 апреля 2013

Я попытался использовать onReceivedError как внутри shouldOverrideUrlLoading (), так и вне этого метода, но в WebViewClient. Я даже пробовал на улице в основном классе деятельности. Я не был доволен противоречивыми результатами. Поэтому я остановился на использовании тестового метода isOnline () и его вызове до вызова loadUrl ().

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getBaseContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo i = cm.getActiveNetworkInfo();
    if ((i == null) || (!i.isConnected())) {
        Toast toast = Toast.makeText(getBaseContext(),
                "Error: No connection to Internet", Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
        return false;
    }
    return true;
}

Тогда это onReceivedError находится в WebViewClient, но за пределами метода overloadurlthingy. Похоже, что это последовательно предотвращает глупые страницы с ухмыляющимися сообщениями об ошибках Android.

    @Override
    public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
        if (view.canGoBack()) {
            view.goBack();
        }
        Toast toast = Toast.makeText(getBaseContext(), description,
                Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
    }

Некоторые люди могут посчитать этот ресурс слишком тяжелым. Ну, не так тяжело, как в приложениях для Facebook и Google+. И не так, как сервисы Google. Честно говоря, я не против использования кислорода из этих приложений. Назови меня плохим парнем ...

2 голосов
/ 10 мая 2016

Вы должны использовать это после окончания страницы

 @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
           //Your code to do
        Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error , Toast.LENGTH_LONG).show();
    }
0 голосов
/ 01 марта 2019

Не забудьте использовать оба метода onReceivedError, поскольку метод с параметром description устарел.Мы используем этот устаревший метод для поддержки ниже API 23.Следовательно, мы можем использовать его во всех версиях SDK.

Вот как я это делаю -

   webview.setWebViewClient(new WebViewClient() {


        @SuppressWarnings("deprecation")
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showkError();
        }

        @TargetApi(android.os.Build.VERSION_CODES.M)
        @Override
        public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
            // Redirect to deprecated method, so you can use it in all SDK versions
            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showError();
        }

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);

            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showError();
        }
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...