2012-11-02 3 views
5

J'essaie d'écrire un programme d'écoute pour un paquet asmack. Ce qui finit par arriver, c'est que parfois l'auditeur n'obtient pas le paquet et le traite. Voici le code:Le programme d'écoute de paquets Smack ne fonctionne pas

try { 

      XMPPMethods.getConnection().addPacketListener(new PacketListener() { 
        @Override 
        public synchronized void processPacket(Packet packet) { 

         if (packet.getPacketID().equals(lastCustomIQId)) { 

          android.os.Message msg = new android.os.Message(); 
          msg.obj = privateData; 
          msg.what = XMPPMethods.ADD_CONTACT_RESULTS; 
          AddContact.addContactHandler.sendMessage(msg); 
         } 
        } 
       }, new PacketIDFilter(lastCustomIQId)); 

Notez que c'est à l'intérieur de la doInBackground (string ... params) partie d'un AsyncTask.

Le paquet est envoyé en utilisant:

JIDIQ.setPacketID(lastCustomIQId); 
JIDIQ.setFrom(XMPPMethods.getCurrentUserFullUserName()); 
JIDIQ.setType(Type.GET); 
XMPPMethods.getConnection().sendPacket(JIDIQ); 

Lorsque le JIDIQ est un QI de asmack. Ce code fonctionne correctement dans la plupart des cas. Mais parfois, le PacketListener ne reçoit pas le paquet envoyé. Je me demande si je devrais utiliser un PacketCollector à la place, ou si l'auditeur est en train de mourir. Est-ce que quelqu'un sait pourquoi cela ne recevrait pas le paquet? Toute connaissance de ce sujet serait grandement appréciée!

Répondre

2

Cela se produira en cas de problème si l'un de vos autres écouteurs de paquets émet une exception.
Chaque fois qu'un paquet arrive en mode smack d'un hit pour tous les paquets d'écoute dans un thread, à l'intérieur d'une boucle for. Si une exception est levée dans un programme d'écoute de paquets, cela interrompra ce processus et aucun autre écouteur de paquets ne sera déclenché.

La manière la plus complète de détecter où cela se produit est de recompiler smack et d'ajouter un gestionnaire d'erreur dans PacketReader.java.

Voici la section de code pertinente. Vous pouvez voir que toute exception levée entraînera l'abandon du thread car il n'y a pas de gestion des erreurs.

private class ListenerNotification implements Runnable { 

    private Packet packet; 

    public ListenerNotification(Packet packet) { 
     this.packet = packet; 
    } 

    public void run() { 
     for (ListenerWrapper listenerWrapper : connection.recvListeners.values()) { 
      listenerWrapper.notifyListener(packet); 
     } 
    } 
} 
1

Je pense que le PacketIDFilter filtre les paquets, donc votre écouteur de paquets ne les obtient pas. Lorsque votre programme d'écoute de paquets n'obtient pas le paquet, vérifiez dans le journal smack si l'ID de paquet est ce que le filtre de paquets attend.

+0

J'ai testé cela, et l'ID de paquet correspond toujours à l'ID de filtre. J'ai aussi essayé d'utiliser une constante comme ID et d'utiliser un autre type de filtre. Les trois paramètres de filtre obtiennent le même résultat. Remarque: Lors de la saisie de l'activité, si le paquet est reçu la première fois, peu importe le nombre de fois que j'interroge le QI et envoie le paquet, il fonctionnera à chaque fois. L'inverse est également vrai, quand j'entre dans l'activité et que le paquet ne soit pas capté par l'écouteur, tous les futurs paquets IQ ne seront pas reçus par l'écouteur. –

+0

@JonathanCornwell Avez-vous vérifié si la connexion où vous enregistrez l'écouteur est la même que celle qui reçoit le paquet? (par exemple, le client se déconnecte puis se reconnecte car la connectivité change, mais la nouvelle connexion n'a pas l'écouteur) –

+0

J'ai testé cela aussi, mais la connexion ne change jamais. J'ai même fait en sorte que toutes les activités aient accès à une version publique de la connexion pour s'assurer que la connexion ne change jamais avec les mêmes résultats. Mise à jour: Il semble que lorsque j'ouvre l'activité et que l'écouteur s'exécute, il fonctionne correctement pour chaque paquet qui lui est envoyé. Mais lorsque l'écouteur ne s'exécute pas, il ne s'exécute pas pour chaque paquet qui lui est envoyé. Fermer et rouvrir l'activité peut changer cela (travailler/ne pas fonctionner), mais la chose étrange est que l'ouverture/fermeture de l'activité ne change rien qui affecte l'auditeur. –

Questions connexes