2013-03-17 147 views
0

我已經在這裏看到關於網絡連接的所有答案,它們非常好。唯一的問題是下一個用例。在Android中測試互聯網連接

如果手機連接到wifi網絡,但路由器與互聯網失去連接。所以我想過寫這除了給周圍SO代碼:

/** Google public DNS service IP address **/ 
public static final String GOOGLE = "http://8.8.8.8"; 

public static boolean isConnected(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context 
     .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    if (info == null) { 
     return false; 
    } 
    if (info.isConnected()) { 
     try { 
      InetAddress addr = InetAddress.getByName(GOOGLE); 
      return addr.isReachable(10000); 
     } catch (UnknownHostException e) { 
      Log.wtf("Utils", e); 
     } catch (IOException e) { 
      Log.wtf("Utils", e); 
     } 
     return false; 
    } else 
     return false; 
    } 
} 

與此唯一的問題是,它運行在主線程,或者更正確的狀態,它崩潰了在主線程中運行。

如果我將在單獨的線程中運行它,它將在從服務器獲得有效答案之前返回。

任何想法如何測試互聯網連接(如與網絡連接)?

+0

何必呢在獲得有效答案之前返回?你能向我們展示你的線程實現嗎? – WarrenFaith

+0

如果我啓動一個新的線程來ping谷歌,該方法將返回而無需等待線程結束。 @WarrenFaith你能提出一種方法來做到這一點,而不會在獲得答案之前完成方法的問題嗎? – thepoosh

+0

線程是如何工作的。你應該實現一個廣播或一個處理程序,如果有連接或不會有通知。 – WarrenFaith

回答

0

你有你的邏輯拆分之前檢查連接,並檢查連接

然後用Handler和後臺線程可以測試連接這樣的以後:

private static void onConnectivityCheckFinish(boolean result){ 

} 
public static void isConnected(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context 
     .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
     if (info == null) { 

      onConnectivityCheckFinish(false); 
     } 
if (info.isConnected()) { 
     final Handler handler = new Handler(

     ); 
     new Thread(){ 
      @Override 
      public void run(){ 
        try { 
         InetAddress addr = InetAddress.getByName(GOOGLE); 
         final boolean result = addr.isReachable(10000); 
         handler.post(new Runnable(){ 
          @Override 
          public void run(){ 
           onConnectivityCheckFinish(result); 
          } 
         }); 
        } catch (Exception e) { 
         Log.wtf("Utils", e); 
         handler.post(new Runnable(){ 

           @Override 
           public void run(){ 
            onConnectivityCheckFinish(false); 
          } 

         }); 



      } 
     } 
     }.start(); 

onConnectivityCheckFinish(false);} 
else { 
    onConnectivityCheckFinish(false); 
} 
}