Android WebView加载网页失败异常处理
2018-09-11 本文已影响15人
翻译不了的声响
开发过程中会遇到WebView加载失败的时候,会出现404、500、找不到网页等错误,页面显示系统默认的错误界面。系统默认界面难看,而且也会暴露网页地址不安全。所以我们需要对WebView加载失败或错误进行处理,自定义一个统一样式来加载失败的界面。

解决方案
我们可以自定义一个View用来展示加载失败的界面,也可以写一个错误展示的 Html让 WebView加载等。这里我们需要先重写WebViewClient
的onReceivedError()
和WebChromeClient
的onReceivedTitle()
方法。
- 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);// 加载自定义错误页面
}
}
}
② 重写WebChromeClient
的onReceivedTitle()
方法处理(该方法已过时)
@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以上处理方法:
① 重写WebViewClient
的onReceivedHttpError()
方法,判断错误码来处理;
@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);// 加载自定义错误页面
}
}
② 重写WebViewClient
的onReceivedError()
方法处理
@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);// 加载自定义错误页面
}
}