閱讀486 返回首頁    go iPhone_iPad_Mac_apple


Android WebView處理404等錯誤

剛剛開始學習Android開發,遇到一個場景,使用WebView來嵌入Wap頁麵,從而達到共享Wap組件的效果。初試了下,發現WebView無法截獲404,500等錯誤,這個感覺很不方便,難道WebView截獲WebKit的返回結果進行相應的操作這麼複雜嗎?不太理解WebView為什麼沒有封裝出更豐富的Http response code的處理回調接口。然而如果用WebView我想404等錯誤的處理是必不可少的,畢竟我們嵌入的是人家的網頁,不能保證一定是正常的。想了下有2個辦法可以做到對返回錯誤結果的捕獲和處理:

1. 看源代碼,分析WebView封裝webkit的原理,在學習一下webkit的錯誤處理機製,從而擴展WebView增加回調處理404等錯誤的功能。

2. 在WebView加載頁麵之前,使用HttpClient的HttpHead來獲取訪問url的相應頭,如果有錯就不加載。

 

由於是新手,我想第一個辦法肯定比較困那,就是熟手也不一定能在短時間內搞定,還是選擇第2個辦法。

 

簡單的判斷代碼如下:

Java代碼  收藏代碼
  1. /** 
  2.      * 檢查url返回內容是否有效 
  3.      * @param url 
  4.      * @return 
  5.      */  
  6.     private boolean validStatusCode(String url) {  
  7.         if (this.mHttpClient == null) {  
  8.             this.mHttpClient = HttpUtils.createHttpClient();  
  9.         }  
  10.   
  11.         try {  
  12.             HttpHead httpGet = new HttpHead(url);  
  13.             HttpResponse response = mHttpClient.execute(httpGet);  
  14.             int statusCode = response.getStatusLine().getStatusCode();  
  15.             String str = String.valueOf(statusCode);  
  16.             if (str.startsWith("4") || str.startsWith("5")) {  
  17.                 return false;  
  18.             }  
  19.             return true;  
  20.         } catch (Exception e) {  
  21.             Log.e(TAG, e.getMessage(),e);  
  22.         }   
  23.         return false;  
  24.     }  

 對於上麵代碼中的HttpUtils.createHttpClient()方法,就不列出了,就是創建一個HttpClient對象。

 

當然還有一點需要注意就是,通過HttpHead訪問網絡的時候,需要結合使用Handler的機製來處理返回結果,以便在UI線程裏麵更新頁麵的顯示。於是可以在一個新的線程裏麵來做網絡的訪問請求:

Java代碼  收藏代碼
  1. public class CheckThread extends Thread{  
  2.         @Override  
  3.         public void run() {  
  4.             boolean ifValid = validStatusCode(REG_URL);  
  5.             Message msg = new Message();  
  6.             Bundle bundle = new Bundle();  
  7.             bundle.putBoolean("validResponse", ifValid);  
  8.             msg.setData(bundle);  
  9.             mHandler.sendMessage(msg);  
  10.         }  
  11.     }  

 最後實現Handler來處理HttpHead的請求結果來刷新UI展現:

Java代碼  收藏代碼
  1. private Handler mHandler  = new Handler() {  
  2.         @Override  
  3.         public void handleMessage(Message msg) {  
  4.             Bundle bundle = msg.getData();  
  5.             boolean validResponse = bundle.getBoolean("validResponse");  
  6.             if(validResponse) {  
  7.                 createWebView();  
  8.             } else {  
  9.                 handlerError();  
  10.             }  
  11.             super.handleMessage(msg);  
  12.         }  
  13.     };  

最後更新:2017-04-02 16:47:54

  上一篇:go Android WebView怎麼樣嵌套Html
  下一篇:go log4j的日誌級別