淺談WebView加載過程中的各種異常

最近上手了一個(gè)項(xiàng)目砾跃,項(xiàng)目中80%的業(yè)務(wù)都是用H5完成的,雖然我是不建議這樣的做法片迅,但是業(yè)務(wù)需求就是這樣那就擼起袖子干吧。
言歸正傳皆辽,既然用到了這么多的H5頁面柑蛇,WebView自然就成了項(xiàng)目中使用頻率最多的控件,于是乎我們對WebView進(jìn)行了一些封裝和優(yōu)化驱闷,這篇文章將會簡單談一談WebView加載過程中可能遇到的各種異常以及處理方法耻台,包括:

1.網(wǎng)絡(luò)連接斷開和服務(wù)端異常

2.網(wǎng)絡(luò)連接正常但無法訪問Internet

3.弱網(wǎng)和服務(wù)器長時(shí)間無響應(yīng)

源碼下載地址:https://github.com/Lonely7th/EsBaseWebView

1.網(wǎng)絡(luò)連接斷開和服務(wù)端異常

這種情況下WebViewClient的執(zhí)行順序?yàn)椋簅nPageStarted()>>onReceivedError()>>onPageFinished()
這類異常相對而言比較容易捕獲,當(dāng)網(wǎng)絡(luò)連接斷開或者服務(wù)端返回異常時(shí)空另,WebView會自動捕獲并執(zhí)行onReceivedError方法盆耽。
對于這種情況我們選擇在onReceivedError方法中將加載狀態(tài)置為加載失敗,接下來在onPageFinished方法中判斷加載狀態(tài)并執(zhí)行相應(yīng)的處理。

@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    super.onReceivedError(view, request, error);
    loadError = true;
}
@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    if(getProgress() >= 100){
        if(loadError){
            onLoadError();
        }else{
            onLoadSuccess();
        }
    }
}

2.網(wǎng)絡(luò)連接正常但無法訪問Internet

這種情況下WebViewClient的執(zhí)行順序?yàn)椋簅nPageStarted()>>onPageFinished()
在網(wǎng)絡(luò)連接正常但無法訪問Internet的情況下摄杂,WebView并不會捕獲異常坝咐,并且會執(zhí)行onPageFinished方法表示加載任務(wù)已經(jīng)完成,這種情況下我們無法通過onReceivedError方法判斷加載失敗的狀態(tài)析恢。
對于這種情況畅厢,我們需要判斷頁面是否真的已經(jīng)加載完成并給與用戶正確的提示,我們在WebView每次執(zhí)行onPageFinished方法時(shí)使用ping命令來判斷網(wǎng)絡(luò)是否可用氮昧,如果網(wǎng)絡(luò)可用再根據(jù)加載狀態(tài)參數(shù)做相應(yīng)的處理。

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    if(getProgress() >= 100){
         new Thread(new Runnable() {
            @Override
            public void run() {
                if(NetworkUtils.isNetworkConnected(getContext()) && NetworkUtils.isNetworkOnline()){//判斷網(wǎng)絡(luò)連接是否異常
                    if(loadError){
                        //加載失敗
                     }else{
                        //加載成功
                    }
               }else{
                    //網(wǎng)絡(luò)異常
               }
            }
        }).start();
   }
}

3.弱網(wǎng)和服務(wù)器長時(shí)間無響應(yīng)

這種情況下WebViewClient的執(zhí)行順序?yàn)椋簅nPageStarted()>>長時(shí)間等待>>onReceivedError()>>onPageFinished()
在服務(wù)器長時(shí)間無響應(yīng)的情況下浦楣,WebView會在執(zhí)行完onPageStarted方法后進(jìn)入長時(shí)間等待(大約2分鐘)袖肥,超過等待時(shí)間后會先后執(zhí)行onReceivedError方法和onPageFinished方法。
從邏輯上看這其實(shí)是一種正常的流程振劳,WebView捕獲到請求超時(shí)異常后執(zhí)行onReceivedError方法椎组,之后執(zhí)行onPageFinished方法完成加載任務(wù),但這套流程的問題在于等待時(shí)間過長且無法設(shè)置历恐,我們需要自定義請求超時(shí)時(shí)間寸癌。
對于這種情況,我們在onPageStarted方法中創(chuàng)建一個(gè)Message并延遲5000ms(超時(shí)時(shí)間)發(fā)送弱贼,Message發(fā)送后判斷WebView是否已經(jīng)加載完成蒸苇,如果未完成則視為請求超時(shí)。

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    webHandler.sendEmptyMessageDelayed(408, TIMEOUT);
}
private Handler webHandler = new Handler(){
   @Override
   public void handleMessage(Message msg) {
       switch (msg.what){
            case 408://請求超時(shí)
                if (getProgress() < 100) {
                   loadError = true;
                   onLoadError();
                }
                break;
       }
    }
};

4.展示異常提示頁面

最后我們談一談如何展示異常提示頁面吮旅,當(dāng)我們捕獲到異常時(shí)溪烤,展示一個(gè)友好的異常提示頁面是有助于提升用戶體驗(yàn)的,由于WebView繼承自ViewGroup庇勃,所以這里我們比較傾向于向WebView中addView的方式檬嘀。
加載異常:

private void onLoadError(int flag){
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
    while (getChildCount() >= 1) {
        removeViewAt(0);
    }
    addView(netErrorView, 0, lp);
}

正常加載:

private void onLoadSuccess(){
    while (getChildCount() >= 1) {
        removeViewAt(0);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市责嚷,隨后出現(xiàn)的幾起案子鸳兽,更是在濱河造成了極大的恐慌,老刑警劉巖罕拂,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揍异,死亡現(xiàn)場離奇詭異,居然都是意外死亡爆班,警方通過查閱死者的電腦和手機(jī)蒿秦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋济,“玉大人棍鳖,你說我怎么就攤上這事。” “怎么了渡处?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵镜悉,是天一觀的道長。 經(jīng)常有香客問我医瘫,道長侣肄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任醇份,我火速辦了婚禮稼锅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僚纷。我一直安慰自己矩距,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布怖竭。 她就那樣靜靜地躺著锥债,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痊臭。 梳的紋絲不亂的頭發(fā)上哮肚,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音广匙,去河邊找鬼允趟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸦致,可吹牛的內(nèi)容都是我干的拼窥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蹋凝,長吁一口氣:“原來是場噩夢啊……” “哼鲁纠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鳍寂,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤改含,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后迄汛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捍壤,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年鞍爱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹃觉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睹逃,死狀恐怖盗扇,靈堂內(nèi)的尸體忽然破棺而出笙蒙,到底是詐尸還是另有隱情夺脾,我是刑警寧澤濒持,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布糕韧,位于F島的核電站,受9級特大地震影響斑鼻,放射性物質(zhì)發(fā)生泄漏蒋纬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一坚弱、第九天 我趴在偏房一處隱蔽的房頂上張望蜀备。 院中可真熱鬧,春花似錦荒叶、人聲如沸碾阁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悼瓮,卻和暖如春戈毒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背横堡。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工埋市, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人命贴。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓道宅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胸蛛。 傳聞我的和親對象是個(gè)殘疾皇子污茵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    小莊bb閱讀 3,493評論 3 25
  • Tips 由于WebView的用法實(shí)在太多,如果您只是想查詢某個(gè)功能的使用——建議Ctrl+F(Commad+F)...
    BugDev閱讀 7,740評論 11 109
  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    南城的人閱讀 4,743評論 0 19
  • WebView·開車指南 2016-08-31BugDev 北京市東城區(qū)首席Bug布道師開山之作葬项,一整月交通事故血...
    53c021c38a1d閱讀 827評論 0 1
  • 《道士塔》:以前就對“洞窟文化”中的這個(gè)著名事件——敦煌洞窟文物事件有所了解泞当。今天讀了余秋雨老師的文字后,更加有了...
    左佳妮閱讀 878評論 2 3