需求:webview在加載的時候如果網絡斷開,會顯示默認的錯誤界面,長得很丑,需要單獨寫一個頁面,在網路出錯的時候顯示,點擊重試以后重新加載網頁
乍看挺簡單的需求,但在實際過程中頁碰到了不少坑,主要是webview造成的,在此記錄一下。
一:如何判斷網絡出錯:
方案:在webviewClient的回調中監聽onReceiveError回調,如果走到這里,說明網絡出錯了,隱藏webview,顯示自定義出錯界面。
於是有了:
如果這么做,會有許多問題:
問題1:該函數是6.0才有的,6.0以下的手機只能用一個過時的回調:
解決方案:為了兼容,需要兩個回調都寫上,都進行處理
問題2: 在有些網頁加載以后,有些鏈接也會收到error回調,但是此時網絡是好的,比如新浪微博的文章,如果點擊以下文章,也會跑到該error回調中來。
解決方案:由於網絡斷開的時候的description是獨有的(errorCode不行),所以可以用description進行判斷:
其中
注意,error.getDescription需要在api > 安卓6.0才能用,需要添加注解@RequireApi。
二:如何恢復顯示
方案:出錯的判斷已經好了,那么如何在網絡恢復的時候顯示webview呢?因為沒有網絡恢復的回調,自然想到用一個Flag來記錄網絡是否出錯。即在onPageStarted的時候flag為false,即沒有出錯,如果回調到onError里,讓flag=true,此時在onPageFinished回調里就能知道網頁有沒有出錯了。
問題:從斷網到網絡恢復,點擊重試,在某些頁面下會出問題(比如新浪微博文章),即:網頁會閃現以下默認的error頁面,原因是什么呢?
經過一番debug終於發現,onPageFinished這個回調,在有些網頁(比如新浪微博)會調兩次,第一次webview的progress只有70 第二次是100,也就是說網頁沒加載完,onPageFinished就已經調用了。
解決方案:判斷progress,只有等於100時,才顯示webview,隱藏自定義出錯界面。