2012-11-02 17 views
5

Ich versuche, einen Listener für ein Asmack-Paket zu schreiben. Was passiert, ist, dass der Hörer das Paket manchmal einfach nicht bekommt und verarbeitet. Hier ist ein Teil des Codes:Smack Packet Listener nicht ausgeführt

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)); 

Hinweis, dass dies innerhalb der doInBackground (string ... params) Teil eines AsyncTask.

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

Wo die JIDIQ ein asmack IQ ist:

Das Paket wird mit gesendet. Dieser Code läuft die meiste Zeit korrekt. Manchmal empfängt der PacketListener das gesendete Paket jedoch nicht. Ich frage mich, ob ich stattdessen einen PacketCollector verwenden sollte oder ob der Hörer irgendwie im Sterben liegt. Weiß jemand, warum das Paket nicht erhalten würde? Jede Kenntnis dieses Themas würde sehr geschätzt werden!

Antwort

2

Dies geschieht in Smack, wenn einer Ihrer anderen Paketlistener eine Ausnahme auslöst.
Jedes Mal, wenn ein Paket innerhalb eines Fore-Loops auftritt, wird ein Treffer an alle Paket-Listener in einem Thread gesendet. Wenn eine Ausnahme in einem Paketlistener ausgelöst wird, wird dieser Thread abgebrochen und es werden keine weiteren Paketlistener ausgelöst.

Die gründlichste Methode, um festzustellen, wo dies geschieht, besteht darin, smack erneut zu kompilieren und einen Fehlerhandler in PacketReader.java hinzuzufügen.

Hier ist der relevante Codeabschnitt. Sie können sehen, dass jede ausgelöste Ausnahme dazu führt, dass der Thread abgebrochen wird, da keine Fehlerbehandlung erfolgt.

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

Ich denke, dass der PacketIDFilter die Pakete filtert, so dass Ihr Paket Listener sie nicht erhält.

Wenn Ihr Paket-Listener das Paket nicht empfängt, überprüfen Sie das Smack-Protokoll, um festzustellen, ob die Paket-ID das erwartet, was der Paketfilter erwartet.

+0

Ich habe dies getestet, und die Paket-ID stimmt immer mit der Filter-ID überein. Ich habe auch versucht, eine Konstante als die ID zu verwenden und eine andere Art von Filter zu verwenden. Alle drei Filtereinstellungen erhalten das gleiche Ergebnis. Hinweis: Wenn das Paket bei der Eingabe der Aktivität das erste Mal empfangen wird, egal wie oft ich den IQ abfrage und das Paket sende, wird es jedes Mal funktionieren. Die Umkehrung ist auch wahr, wenn ich die Aktivität betrete und das Paket nicht vom Zuhörer aufgenommen wird, werden alle zukünftigen IQ-Pakete vom Zuhörer nicht empfangen. –

+0

@JonathanCornwell Haben Sie überprüft, ob die Verbindung, bei der Sie den Listener registrieren, dieselbe ist, die das Paket empfängt? (Zum Beispiel trennt der Client die Verbindung und verbindet sich dann wieder, weil sich die Verbindung ändert, aber die neue Verbindung hat den Listener nicht) –

+0

Ich habe das auch getestet, aber die Verbindung ändert sich nie. Ich habe es sogar so gemacht, dass alle Aktivitäten Zugriff auf eine öffentliche Version der Verbindung hatten, um sicherzustellen, dass sich die Verbindung niemals mit den gleichen Ergebnissen ändert. Update: Es scheint, als wenn ich die Aktivität öffnen und der Listener ausgeführt wird, wird es ordnungsgemäß für jedes Paket ausgeführt, das an es gesendet wird. Wenn der Listener jedoch nicht ausgeführt wird, wird er nicht für jedes an ihn gesendete Paket ausgeführt. Das Schließen und erneute Öffnen der Aktivität kann dies ändern (funktioniert/funktioniert nicht), aber das Seltsame ist, dass das Öffnen/Schließen der Aktivität nichts ändert, was den Zuhörer beeinflusst. –