2012-06-14 3 views
2

J'ai une question spécifique sur la connexion wifi dans Android.Je travaille sur un projet qui télécharge des données à partir du serveur web et chaque fois avant de commencer la synchronisation, je vérifie la connexion Internet comme ceci:Android vérifier connexion wifi

public static boolean isOnline(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 

public static boolean chkNetworkStatus(Context context) { 
    boolean result = false; 
    new Thread() { 
     @Override 
     public void run() { 


      for(int i=0;i<3;i++){ 
      HttpGet requestForTest = new HttpGet("http://m.google.com"); 
      try { 
        new DefaultHttpClient().execute(requestForTest); 
        responded = true; 
       } catch (Exception e) { 
        responded = false; 
       } 
      } 
     } 
    }.start(); 
    boolean isOnline = isOnline(context); 
    if(responded && isOnline){ 
     result = true; 
    } else { 
     result = false; 
    } 

    Log.e("","responded : "+responded); 
    return result; 
} 

mais dans cette situation quand je suis toujours connecté au wifi et je marche (perte de connexion) et le bouton de synchronisation de presse, il est encore de retour vrai parce que je suis connecté, mais en réalité il ne fait rien.

Y at-il de toute façon que je peux détecter cela ou je devrais utiliser la fonction connectionTimeOut dans la classe HttpURLConnection que j'utilise?

Répondre

1

En fait, je ne sais pas celui résoudre votre problème ou non, mais , vous pouvez définir le délai de connexion avec votre HttpGet demande,

Cela fonctionne dans mon cas, Donc je n'ai pas besoin de vérifier la disponibilité de l'Internet ..

try 
    { 

    HttpGet request = new HttpGet(url)); 
    HttpParams httpParameters = new BasicHttpParams(); 
    // Set the timeout in milliseconds until a connection is established. 
    // The default value is zero, that means the timeout is not used. 
    int timeoutConnection = 60000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    // Set the default socket timeout (SO_TIMEOUT) 
    // in milliseconds which is the timeout for waiting for data. 
    int timeoutSocket = 60000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
    // create object of DefaultHttpClient  
    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
    request.addHeader("Content-Type", "application/json"); 
    HttpResponse response = httpClient.execute(request); 
    // get response entity 
    HttpEntity entity = response.getEntity(); 
    // convert entity response to string 

    if (entity != null) 
     { 
     result = EntityUtils.toString(entity); 
     } 

    } 
catch (SocketException e) 
    { 
    return "-222" + e.toString(); 
    } 
catch (Exception e) 
    { 
    return "-333" + e.toString(); 
    } 

Note: la demande et tout autre code peut être différent dans votre cas, il vient de l'idée de la façon dont HttpGet params utilisés pour TimeOut ensemble de connexion ..

+0

Il peut y avoir plusieurs raisons possibles lorsque votre application dispose d'une connexion Internet mais le serveur ne répond pas ou la connexion n'est pas établie. Il est donc préférable de régler TimeOut avec votre demande Web. – user370305

+0

En fait je lis la réponse du serveur en morceaux, c'est pourquoi j'utilise la classe 'HttpURLConnection' qui fonctionne parfaitement dans mon cas et la façon dont j'ai résolu mon problème est de définir connectionTimeOut et d'utiliser try-catch pour afficher un dialogue une erreur. Voilà pourquoi je vais accepter votre réponse:) –

1

essayer de le faire comme ceci:

public static void isNetworkAvailable(final Handler handler, final int timeout) 
{ 

    // ask fo message '0' (not connected) or '1' (connected) on 'handler' 
    // the answer must be send before before within the 'timeout' (in 
    // milliseconds) 

    new Thread() 
    { 

     private boolean responded = false; 

     @Override 
     public void run() 
     { 

      // set 'responded' to TRUE if is able to connect with google 
      // mobile (responds fast) 

      new Thread() 
      { 

       @Override 
       public void run() 
       { 
        HttpGet requestForTest = new HttpGet("http://m.google.com"); 
        try 
        { 
         new DefaultHttpClient().execute(requestForTest); // can 
                      // last... 
         responded = true; 
        } 
        catch (Exception e) 
        { 
        } 
       } 

      }.start(); 

      try 
      { 
       int waited = 0; 
       while (!responded && (waited < timeout)) 
       { 
        sleep(100); 
        if (!responded) 
        { 
         waited += 100; 
        } 
       } 
      } 
      catch (InterruptedException e) 
      { 
      } // do nothing 
      finally 
      { 
       if (!responded) 
       { 
        handler.sendEmptyMessage(0); 
       } 
       else 
       { 
        handler.sendEmptyMessage(1); 
       } 
      } 

     } 

    }.start(); 

} 

Handler h = new Handler() 
{ 

    @Override 
    public void handleMessage(Message msg) 
    { 

     if (msg.what != 1) 
     { // code if not connected 


     } 
     else 
     { // code if connected 


     } 

    } 
}; 

Et dans votre activité, appelez ça comme ça:

isNetworkAvailable(h, 2000); 
1

Fondamentalement, vous recevrez la diffusion lors du changement de connectivité réseau si vous vous inscrivez.

android.net.conn.CONNECTIVITY_CHANGE 

Pour Solution Ici vous allez.

Vous devez vous inscrire et gérer BroadcastReceiver android.net.conn.CONNECTIVITY_CHANGE

Étape 1

Inclure la permission suivante dans le manifeste

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Etape 2

Laissez kno Android w quelle classe sera enregistrée pour BroadCast Receiver.

<receiver android:name="ConnectivityReceiver_package_name.ConnectivityReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

Étape 3

Mettez votre logique pour différents États du réseau.

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 

    boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false); 

    if(noConnectivity){ 

     //Show Warning Message 
     //Take appropriate actions. 
    } 

    } 

} 
Questions connexes