2010-07-19 22 views
1

Je rencontre des problèmes pour obtenir des résultats cohérents lorsque je vérifie si le réseau est disponible ou non. J'utilise cet extrait de code dans une classe AppPreferences pour vérifier la disponibilité d'un réseau.La vérification de disponibilité du réseau renvoie false mais le téléphone est en ligne.

/** 
    * @return the networkAvailable 
    */ 
    public boolean isNetworkAvailable() { 
     connectionManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     networkAvailable = connectionManager.getActiveNetworkInfo() != null && connectionManager.getActiveNetworkInfo().isConnected(); 
     return networkAvailable; 
    } 

Avant chaque course, je mets le contexte comme ci-dessous:

timer.scheduleAtFixedRate(

       new TimerTask() { 

        public void run() { 

         appPreferences.setContext(getBaseContext()); 

         if (appPreferences.isNetworkAvailable()){ 

          // perform task 

         } 

        } 
       }, 
       0, 
       UPDATE_INTERVAL); 

Je ne sais que ce n'est pas lié au fil de fond que j'ai un appel OnReceive faire la même logique et encore cette vérification échoue .

Il semble se produire principalement quand il se déplace entre une connexion de données cellulaire et à wifi, ou vice versa. Le contexte dans lequel il a été créé semble rester même si je le mets à jour.

Quelqu'un at-il une idée de ce qui pourrait être le problème ici?

+0

essayez-vous cela dans l'émulateur? parce que j'ai vu un comportement étrange aussi. Par exemple, j'ai essayé de couper la connexion réseau en appuyant sur F8 dans l'émulateur, mais il peut toujours atteindre Internet. – Erdal

+0

Non, cela se passe pour une application en direct et je suis plus que perplexe pourquoi cela arrive. Il semble être bloqué au contexte initial et ne met pas à jour cette information de réseau quand il se déplace entre les réseaux. – Erik

+0

Erdal: Vérifiez la réponse ci-dessous. Si c'est vrai alors je ne suis pas très content car cela rend cet appel plutôt inutile. J'espère avoir tort. :-) – Erik

Répondre

1

Il semble que les informations réseau actives restent dans l'état où le contexte du service/activité/récepteur est démarré. Par conséquent, si vous le démarrez sur un réseau, puis que vous le déconnectez (c'est-à-dire qu'il passe de la 3G à la Wifi et déconnectez la connexion 3G), il restera connecté à la première connexion active.

Il me semble que la meilleure solution est d'utiliser getApplicationContext à la place car cela ne sera pas lié lorsque vous avez démarré la "tâche" particulière.

Mise à jour: connexes est que si vous exécutez des applications sur androïdes (en Nexus particulier One) pendant une longue période de temps lorsqu'il est connecté à Wifi ne vérifiez que vous assurez-vous ne laissez pas le sommeil Wifi lorsque l'écran dort . Vous serez en mesure de définir cela à l'option avancée sous réseaux sans fil.