2010-10-22 5 views
3

J'ai un service sur Android qui écoute et répond aux paquets qu'il reçoit via la multidiffusion.La prise Android Multicast arrête d'écouter

Cela fonctionne la plupart du temps, mais malheureusement, je constate que de temps en temps il va juste arrêter de recevoir des paquets. Le thread reste bloqué sur l'appel à MulticastSocket.receive(), mais rien ne sort. J'ai lentement essayé de trouver ce qui déclenche cela, et j'ai découvert que le fait de l'éteindre et de le rallumer, ou de changer de connexion sans fil le fera.

Pour continuer à écouter mes paquets, j'ai besoin de fermer MulticastSocket et de le recréer. Cependant, je n'ai trouvé aucun moyen de le faire --- Je ne semble pas recevoir de notification que quelque chose est arrivé: pas d'intentions, pas d'exceptions Java, rien. Je m'attendrais à ce que la réception lance une IOException si la socket est invalide, mais cela ne semble pas se produire.

Quelqu'un peut-il donner un aperçu de ce qui se passe réellement et b) comment contourner ce problème? En ce moment, ma meilleure estimation est de détruire et de recréer continuellement le socket toutes les dix secondes, et c'est juste mauvais.

Répondre

2

Je pense que le changement des réseaux sans fil est à peu près semblable à la désactivation et de réactiver le réseau (probablement avec une adresse IP différente et le routage), donc pas de surprise que les choses se brisent.

Peut-être que l'enregistrement de modifications dans les informations réseau vous donnerait l'avertissement nécessaire?

http://developer.android.com/reference/androi/net/ConnectivityManager.html#CONNECTIVITY_ACTION

et pages associées

+2

Oui, ça l'a fait. Cependant, il s'avère que votre verrou de multidiffusion est détruit quand la connectivité disparaît (le long délai était moi réécrire mon code trois fois avant que je comprenne ceci dehors). Donc, vous devez réacquérir le verrou à chaque fois que la connexion revient. –

2

Acquérir un verrou de multidiffusion?

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = manager.createMulticastLock("lock name"); 
lock.setReferenceCounted(true); 
lock.acquire(); 

Il semble aussi que certains périphériques bloc multidiffusion:

Multicast on Android 2.2

+0

Oui, je suis l'acquisition de la serrure, et je l'ai vérifié que mon appareil n'implémente réellement multicast. –