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!
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. –
@ 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) –
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. –