一 前言
為了提高Android webview異常情況對(duì)于用戶(hù)的友好度,可以從兩個(gè)方面入手,一是服務(wù)端統(tǒng)一處理,一是客戶(hù)端監(jiān)聽(tīng)異常狀態(tài)加載相應(yīng)的本地404或者超時(shí)頁(yè)面。
由于我們的App是政務(wù)類(lèi)平臺(tái),所以會(huì)接入大量第三方服務(wù)(而且是政府部門(mén)相關(guān)網(wǎng)頁(yè)),標(biāo)準(zhǔn)不一樣,基于上述業(yè)務(wù)場(chǎng)景,服務(wù)端的解決辦法,實(shí)現(xiàn)難度太高。
因此只能從客戶(hù)端入手解決,下面我們開(kāi)始做客戶(hù)端處理。
二 Webview的版本bug
由于android webview 早期的不成熟,在6.0以下自身存在bug(https://code.google.com/p/android/issues/detail?id=968
)的原因,android開(kāi)發(fā)者們通過(guò)查看官方文檔,總結(jié)了一些異常兼容性處理方法;詳情參考這邊文章 http://www.itdecent.cn/p/5c16e02ed422
- Android6.0以上判斷404或者500
重寫(xiě)WebViewClient()的onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)方法,通過(guò)狀態(tài)碼判斷; - Android 6.0以下判斷404或者500
重寫(xiě)WebChromeClient()的onReceivedTitle(WebView view, String title)方法,通過(guò)標(biāo)題是否包含“404”,"500","error"等字符判斷; - 斷網(wǎng)或者超時(shí)判斷(注意404或者500等其他非斷網(wǎng)超時(shí)情況不走這個(gè)方法)
重寫(xiě)WebViewClient() 的onReceivedError(WebView view, int errorCode, String description, String failingUrl)
三 兼容性測(cè)試
以上操作看起來(lái)都很順利,其實(shí)是我天真了,我們開(kāi)始測(cè)試
3.1 6.0以上系統(tǒng)測(cè)試
問(wèn)題:
1.先看404的情況,果然進(jìn)了onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)方法,但是問(wèn)題來(lái)了,正常的頁(yè)面也返回404,去查了一下官方文檔,發(fā)現(xiàn)一個(gè)請(qǐng)求頁(yè)面任何資源的加載都會(huì)引發(fā)HTTP ERROR都會(huì)引起該方法的回調(diào)(例如頁(yè)面的內(nèi)部請(qǐng)求圖標(biāo),或者圖片等),
解決方法:
通過(guò)判斷當(dāng)前請(qǐng)求的url地址request.getUrl()是否等于根url,但是有一些請(qǐng)求地址通過(guò)request.getUrl()獲取的url不等于根url,這個(gè)目前還沒(méi)找到好的辦法;
3.2 6.0以下系統(tǒng)測(cè)試
問(wèn)題
1.先看404的情況,onReceivedTitle,這個(gè)方法還是有個(gè)別服務(wù)返回的標(biāo)題不包含“404”,"500","error"等字符,暫時(shí)也沒(méi)有好的解決方法;
3.3 超時(shí)測(cè)試
問(wèn)題:
onReceivedError監(jiān)聽(tīng)超時(shí)情況,需要很長(zhǎng)時(shí)間,而webview請(qǐng)求的超時(shí)時(shí)間也不能控制,太影響用戶(hù)體驗(yàn);
解決辦法:
在WebViewClient的onPageStarted(改方法是每個(gè)請(qǐng)求地址開(kāi)始時(shí)調(diào)用),開(kāi)啟一個(gè)線程,設(shè)置一個(gè)時(shí)間監(jiān)聽(tīng),當(dāng)超過(guò)這個(gè)時(shí)間,加載超時(shí)頁(yè)面;
參考文章:
[1]http://www.itdecent.cn/p/5c16e02ed422
[2]https://jiandanxinli.github.io/2016-08-31.html