2014-01-17 44 views
1

我知道如何檢查網絡是打開還是關閉,但我不知道是否抓住這個異常也沒關係。檢查互聯網連接或發現異常?

例如,在這段代碼中,我試着做一個GET。如果有連接並且服務器正在運行,則該方法返回true。如果沒有連接(或服務器關閉,或其他),則會拋出異常並返回false。那麼,在這種簡單的情況下,是否有必要在GET之前檢查連接?

private boolean get(String uri) { 
    boolean success = false; 
    try { 
    HttpGet request = buildGet(uri); 
    HttpResponse response = new DefaultHttpClient().execute(request); 

    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      /* DO SOMETHING */ 
      success = true; 
     } 
    } 
    } catch (Exception e) { 
    /* If we get here -> we can't do a GET request */ 
    } 

    return success; 

}

(此外,檢查互聯網連接,我們需要添加ACCESS_NETWORK_STATE許可)

+1

這是一個不好的方法。可能會拋出異常,這不僅僅是因爲網絡關閉,而是由於其他原因。例如,'buildGet'中的一些代碼可能有一個bug並且拋出'NullPointerException'。這個例外會被你抓住,所以代碼變得更難調試 –

+0

你會從消費資源中拯救你的自我,試圖連接到網絡 –

回答

0
private boolean isNetworkConnected() { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = cm.getActiveNetworkInfo(); 
     if (ni == null) { 
      // There are no active networks. 
      return false; 
     } else 
      return true; 
    } 
+0

是的,但我沒有問這個問題。 –

0

它通常是更好地發出請求之前檢查連接。但是,在某些情況下,您應該嘗試提出請求並處理異常。一個示例是,如果您的HTTP客戶端具有緩存層,並且您的GET請求可能在沒有任何網絡請求的情況下從緩存中滿足。

在任何情況下,如果您要在請求中捕獲異常,至少只能捕獲IOException,以便您不會意外捕獲其他類型的編碼錯誤。