2013-03-17 5 views
0

Я видел все ответы здесь о подключении к сети, и они очень хороши. Единственная проблема - следующий вариант использования.Тест для подключения к Интернету в Android

Если телефон подключен к сети Wi-Fi, но маршрутизатор потерял соединение с Интернетом. так что я думал о написании этого дополнения к коду данного вокруг 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 google, метод вернется, не дожидаясь окончания потока. @WarrenFaith вы можете предложить способ сделать это без вопроса о завершении метода до получения ответа? – thepoosh

+0

Каким образом поток предназначен для работы. Вы должны реализовать Broadcast или обработчик, который будет уведомлен, если есть соединение или нет. – 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); 
} 
} 
Смежные вопросы