Comment garder un XMPP connexion stable sur Android avec (a)smack?
- Je utiliser asmack-android-7-beem bibliothèque pour Android. J'ai un service d'arrière-plan en cours d'exécution, comme mon appli reste en vie. Mais tôt ou tard, XMPP connexion meurt sans préavis. Le serveur dit que le client est toujours en ligne mais pas les paquets sont envoyés ou reçus.
Par exemple, le client ne bénéficie pas de la présence des paquets lorsque d'autres clients ont une présence nouvelle. J'ai XMPPConnection comme un attribut de ma classe principale de l'Application.
J'ai mis ConnectionConfiguration config.setReconnectionAllowed(true)
avant que la connexion a été faite.
Mais la reconnexion n'arrive pas. XMPPConnection connection.isConnected()
renvoie la valeur true.
De sorte que le client n'est pas conscient que la connexion est réellement perdu.
Est-il un moyen de garder la connexion?
- Connexes: stackoverflow.com/questions/11342920/...
- isConnected méthode renvoie l'état de l'objet, mais smack ne peut pas gérer les modifications de connectivité réseau, vous devez écrire le code de vérification que vous êtes en mesure de ping du serveur ou non, selon que vous avez besoin pour effectuer plus d'opérations, pour plus de détails, vous pouvez voir la vue de ma réponse
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de asmack mettre un peu de code dans votre application pour faire Dalvik charge de la ReconnectionManager classe et exécuter l'initialisation statique bloc:
ReconnectionManager
sur Android n'est généralement pas la solution complète que vous le souhaitez réagir lorsque la connectivité de données à des changements (par exemple GSM à l'interrupteur wi-fi), etReconnectionManager
n'est pas au courant, par exemple, de AndroidNETWORK_CONNECTIVITY_CHANGED
intentions. Également sur les nouveaux Smack versions (4.1 ou supérieur), qui tourne sous Android, il n'est plus nécessaire pour effectuer l'initialisation manuelle: Smack sera entièrement initialisé automatiquement.En fait Il n'y a aucun problème avec la Reconnexion manager. Vous devez d'abord ajouter écoute de connexion à votre gestionnaire de connexion.
si une erreur s'est produite à la connectionClosedOnError(à l'Exception de arg0) sera appelée automatiquement
lorsque la connexion est fermée
puis vérifier cela appel reconnectingin() la méthode et essayer de se reconnecter.
Espère que cela va vous aider.
utilisez code ci-dessous pour vérifier la connexion
PingManager pingManager = PingManager.getInstanceFor(connection); pingManager.setPingInterval(5000);
ajouter listner de ping échec de la manipulation de la poignée de connexion est connecté ou pas, parce isConnected méthode n'est pas fiable pour vérifier l'état de la connexion.
pingManager.registerPingFailedListener(PingFailedListener);
Pour une connectivité de réseau est très gros problème si vous avez besoin pour vérifier la connectivité réseau pour mobile à l'aide du récepteur de radiodiffusion et sur les données de la reconnexion, vous pouvez utiliser pingMyServer méthode pour vérifier la connexion est vivant ou pas, si vous devez recevoir de réponse ping à partir du serveur, des moyens de connexion est vivant sinon sur commande ping échoue, vous pouvez rétablir la connexion manuellement.
Voici mon code fonctionne bien pour ReconnectionManager
1) Ajouter
addConnectionListener
sur xmpp connexion2) si la connexion a été fermée puis se reconnecter automatiquement à l'aide de
ReconnectionManager
classe3)
ConnectionListener
pour rétablir la connexion, se connecter et authentifié sur le serveur. si la connexion authentifié avec succès avec le serveur également vous inscrirePingManager
etServerPingWithAlarmManager
classe.J'ai le même problème, sauf que Mon programme s'exécute sur le serveur côté de la JVM.
J'ai utilisé smack 4.0 en premier lieu. Puis j'ai mis à jour smack 4.1, mais le problème n'est toujours pas arrivé. Enfin j'ai trouvé un module de configuration: PingManager
Après l'utilisation de ce, de la survenance de cette situation a été déroulant.
Dans Smack 4.1, j'utilise
ServerPingWithAlarmManager
. Vous pouvez trouver plus de détails sur la tenue de connexion ramzandroid blog ici.compile 'org.igniterealtime.smack:smack-extensions:4.2.0'
etcompile 'org.igniterealtime.smack:smack-android:4.2.0'
Pour ces cas, vous devez gérer la déconnexion manuelle je veux dire que vous devez intercepter toute déconnexion, connexion auditeur averti lorsque vous avez obtenu une déconnexion plus.
public void connectionClosedOnError(Sauf exception)