Android WebView onReceivedError()

时间:2011-02-14 21:49:15

标签: android webview

有没有人知道是否有办法拦截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
}

4 个答案:

答案 0 :(得分:29)

根据文档和我的经验,它应该工作得很好。 您只需在WebView中使用覆盖方法WebClient设置onReceivedError

以下是我的一些旧测试应用的片段:

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

我测试了它并且它工作得很好。检查您的日志,看看你得到了什么样的代码错误。 希望它有所帮助。

答案 1 :(得分:11)

我已尝试在shouldOverrideUrlLoading()内部和该方法之外使用onReceivedError但在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中,但在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();
    }

有些人可能会认为这种资源很重。嗯,不像Android Facebook和Google+应用程序那么重。而不是谷歌服务的方式。坦率地说,我不介意使用那些应用程序氧气。叫我一个坏孩子......

答案 2 :(得分:2)

你应该在页面完成后使用它

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

答案 3 :(得分:0)

请记住同时使用两个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();
        }
  });