Android WebView加载网页失败异常处理

开发过程中会遇到WebView加载失败的时候,会出现404、500、找不到网页等错误,页面显示系统默认的错误界面。系统默认界面难看,而且也会暴露网页地址不安全。所以我们需要对WebView加载失败或错误进行处理,自定义一个统一样式来加载失败的界面。

《Android WebView加载网页失败异常处理》 网页加载失败图

解决方案

我们可以自定义一个View用来展示加载失败的界面,也可以写一个错误展示的 Html让 WebView加载等。这里我们需要先重写WebViewClientonReceivedError()WebChromeClientonReceivedTitle()方法。

  • Android 6.0以下处理方法:

① 判断 Html页面的标题中是否含有“Error”、“找不到网页”等信息;

@Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
        // android 6.0 以下通过title获取判断
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            if (title.contains("404") || title.contains("500") || title.contains("Error") || title.contains("找不到网页") || title.contains("网页无法打开")) {
                view.loadUrl("about:blank");// 避免出现默认的错误界面
                view.loadUrl(mErrorUrl);// 加载自定义错误页面
            }
        }
    }

② 重写WebChromeClientonReceivedTitle()方法处理(该方法已过时)

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    super.onReceivedError(view, errorCode, description, failingUrl);
    //6.0以下执行
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return;
    }
    view.loadUrl("about:blank");// 避免出现默认的错误界面
    view.loadUrl(mErrorUrl);// 加载自定义错误页面
}
  • Android 6.0以上处理方法:

① 重写WebViewClientonReceivedHttpError()方法,判断错误码来处理;

@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
    super.onReceivedHttpError(view, request, errorResponse);
    // 这个方法在 android 6.0才出现
    int statusCode = errorResponse.getStatusCode(); 
    if (404 == statusCode || 500 == statusCode) {
        view.loadUrl("about:blank");// 避免出现默认的错误界面
        view.loadUrl(mErrorUrl);// 加载自定义错误页面
    }
}

② 重写WebViewClientonReceivedError()方法处理

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
    super.onReceivedError(webView, webResourceRequest, webResourceError);
    if (webResourceRequest.isForMainFrame()) {//是否是为 main frame创建
        view.loadUrl("about:blank");// 避免出现默认的错误界面
        view.loadUrl(mErrorUrl);// 加载自定义错误页面
    }
}
    原文作者:翻译不了的声响
    原文地址: https://www.jianshu.com/p/12a011af51c4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞