首先想到的是實現一個WebViewClient,監聽裏面的onreceivererror()做相應的異常處理,後面發現每次出現error之後又會有onPageStarted,onPageFinish()兩次,不會在我想要處理的onreceivererror()顯示我想要的異常頁面:
原因可能如下(本人自己的猜測),由於webview底層的解析和webviewclient是分處在兩個不同的線程,而當webview底層解析遇到問題會去顯示android自身的錯誤界面,會走一次onPageFinish(),webviewclient會走一次OnPageStart(),,onPageFinish(),所以這個時候加載的默認界面還是webview自身的。
解決辦法如下:
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mIsLoadResource = false;
mWapLoadingView.setVisibility(View.VISIBLE);
mTitleView.startRefreshRotate();
mWapLoadFailed.setVisibility(View.GONE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mWapLoadingView.setVisibility(View.GONE);
mTitleView.stopRefreshRotate();
if (!mIsLoadResource) {
mWapLoadFailed.setVisibility(View.VISIBLE);
view.stopLoading();
}
}
public void onLoadResource(WebView view, String url) {
mIsLoadResource = true;
super.onLoadResource(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
mTitleView.stopRefreshRotate();
if (!mIsLoadResource) {
mWapLoadFailed.setVisibility(View.VISIBLE);
view.stopLoading();
}
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();// 接受證書
mTitleView.stopRefreshRotate();
if (!mIsLoadResource) {
mWapLoadFailed.setVisibility(View.VISIBLE);
view.stopLoading();
}
}
t通過OnLoadResource的回調來應對錯誤的情況,由於webview自身加載本機的默認失敗頁面是不會調用onloadresource的那麼就可以通過onloadresource來作爲是否是加載失敗的標誌,從而對錯誤做相應的處理