在我们使用WebViewClient时,如果不做任何处理,经常会在页面出错时显示系统自带错误页面,长的比较丑,那么我们想要覆盖这个错误页面,显示成我们自己的错误页面,该如果处理?
很简单,重写WebViewClient,通过回调交给调用者来换成我们自己的页面。
原理:覆盖Client接收到的错误,加载空页面
提供回调方法用于处理加载过程,既页面开始/页面结束/接收错误
踩过的坑:webview重加载的时候,如果使用webView.reload,依然会出现某些奇怪的现象,所以还是推荐使用webview.loadUrl的方式去重加载页面
下面看完整实现:
[代码]java代码:
public class OurWebClient extends WebViewClient {
OnPageCallback onPageCallback ;
public int ERROR_CODE = 0;
public int pageStartCount = 0;
int pageFinishCount = 0;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
pageStartCount++;//实际页面开启过程会多次调用该方法,这里统计,后面会用到
if (ERROR_CODE == 0) {//没现错误
if (onPageCallback != null && pageStartCount==1)//保证回调只执行一次
onPageCallback .onLoadStarted();//无错,正常加载
} else {
if (onPageCallback != null)
onPageCallback .onErrorReceived();//有错误,自定义覆盖处理
}
//初始化webview与加载webview要一致
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
pageFinishCount++;
if (ERROR_CODE == 0) {
if (onPageCallback != null && pageFinishCount==1)
onPageCallback .onLoadFinished();
} else {
if (OnPageCallback != null)
OnPageCallback .onErrorReceived();//有错误,自定义覆盖处理;某些错误出现在页面加载过程中,此时就需要覆盖错误页面
}
super.onPageFinished(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
ERROR_CODE = errorCode;// 将错误码记下,用于判断页面状态
if (view != null) {
view.loadUrl("about:blank");//接收到错误时加载空页面,如果没有这个过程,在显示我们自己的错误页面之前默认错误页面会一闪而过,可自行实验
}
super.onReceivedError(view, errorCode, description, failingUrl);
}
//重加载页面状态重置
public void reset() {
if (ERROR_CODE != 0) {// 出现error后重新加载ERROR_CODE重置
ERROR_CODE = 0;
}
pageStartCount = 0;
pageFinishCount = 0;
}
//向调用者提供的回调
public interface OnPageCallback {
void onErrorReceived();
void onLoadStarted();
void onLoadFinished();
}
public void setOnPageCallback (OnPageCallback callback) {
this.onPageCallback = callback;
}
}