2012-11-02 10 views
5

Próbuję napisać listenera dla pakietu asmack. Co się dzieje, to słuchacz czasami po prostu nie dostaje pakietu i nie przetwarza go. Oto niektóre z kodu:Nie można uruchomić odbiornika pakietów Smack

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

pamiętać, że jest wewnątrz doInBackground (ciąg ... params) część asynctask.

Pakiet jest wysyłany przy użyciu:

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

Jeżeli JIDIQ jest asmack IQ. Ten kod działa poprawnie NAJCZĘŚCIEJ. Ale czasami pakiet PacketListener po prostu nie otrzymuje wysłanego pakietu. Zastanawiam się, czy zamiast tego powinienem używać PacketCollector, czy też słuchacz jakoś umiera. Czy ktoś wie, dlaczego nie otrzyma pakietu? Każda wiedza na ten temat byłaby ogromnie doceniona!

Odpowiedz

2

To się stanie, gdy jeden z twoich innych programów nasłuchujących wywoła wyjątek.
Za każdym razem, gdy pojawia się pakiet, następuje odpalanie spawn trafienia do wszystkich detektorów pakietów w jednym wątku, wewnątrz jednej pętli for. Jeśli wyjątek zostanie zgłoszony w detektorze pakietów, przerwie to wątek i nie zostaną uruchomione żadne dalsze detektory pakietów.

Najbardziej dokładnym sposobem wykrycia, gdzie to się dzieje, jest rekompilacja klapsów i dodanie procedury obsługi błędów w PacketReader.java.

Oto odpowiednia sekcja kodu. Widać, że każdy wyjątek, który zostanie zgłoszony, spowoduje przerwanie wątku, ponieważ nie ma obsługi błędów.

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

Myślę, że PacketIDFilter filtruje pakiety, więc twój odbiornik pakietów ich nie pobiera.

Po odebraniu pakietu przez pakiet nasłuchujący pakietu należy sprawdzić log smack, aby sprawdzić, czy identyfikator pakietu jest tym, czego oczekuje filtr pakietów.

+0

Przetestowałem to, a identyfikator pakietu zawsze odpowiada identyfikatorowi filtra. Próbowałem również używać stałej jako identyfikatora i przy użyciu innego rodzaju filtru. Wszystkie trzy ustawienia filtru mają taki sam efekt. Uwaga: Jeśli wchodzisz do działania, jeśli pakiet jest odbierany po raz pierwszy, to bez względu na to, ile razy wyślę zapytanie do IQ i wyśle ​​pakiet, będzie działało za każdym razem. Odwrotność również jest prawdą, kiedy wchodzę do działania, a pakiet nie zostanie odebrany przez słuchacza, wszystkie przyszłe pakiety IQ nie zostaną odebrane przez słuchacza. –

+0

@ JonathanCornwell Czy sprawdziłeś, czy połączenie, w którym rejestrujesz słuchacza, jest tym samym, co odbiera pakiet? (na przykład klient rozłącza się, a następnie ponownie łączy, ponieważ łączność się zmienia, ale nowe połączenie nie ma odbiornika) –

+0

Testowałem to również, ale połączenie nigdy się nie zmienia. Udało mi się nawet, aby wszystkie czynności miały dostęp do publicznej wersji połączenia, aby zapewnić, że połączenie nigdy się nie zmieni z tymi samymi rezultatami. Aktualizacja: Wydaje się, że po otwarciu działania i uruchomieniu detektora będzie on działał poprawnie dla każdego wysłanego do niego pakietu. Ale gdy słuchacz nie działa, nie uruchomi się dla każdego wysłanego do niego pakietu. Zamykanie i ponowne otwieranie działania może to zmienić (działa/nie działa), ale dziwne jest to, że otwieranie/zamykanie działania nie zmienia niczego, co wpływa na słuchacza. –

Powiązane problemy