Android WebView onReceivedError()

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

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

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

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

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

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

Ответ 1

Согласно документации и моему опыту, она должна работать неплохо. Вам просто нужно установить WebClient с помощью метода override 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);
    }
 });

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

Ответ 2

Я попытался использовать onReceivedError как внутри shouldOverrideUrlLoading(), так и вне этого метода, но в WebViewClient. Я даже пробовал в основном классе Activity. Я был недоволен несогласованными результатами. Поэтому я решил использовать тестовый метод 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, но вне метода overloadurltingy. Это, похоже, постоянно предотвращает глупые, ухмыляющиеся страницы ошибок андроида.

    @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();
    }

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

Ответ 3

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

 @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();
    }