我正在尝试为asmack数据包编写一个监听器。最终发生的事情是监听器有时只是没有得到数据包并处理它。以下是一些代码:
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));
请注意,这是一个asynctask的doInBackground(string ... params)部分。
正在使用以下方式发送数据包:
JIDIQ.setPacketID(lastCustomIQId);
JIDIQ.setFrom(XMPPMethods.getCurrentUserFullUserName());
JIDIQ.setType(Type.GET);
XMPPMethods.getConnection().sendPacket(JIDIQ);
JIDIQ是一个asmack IQ。这段代码大部分时间都正确运行。但有时PacketListener只是没有收到发送的数据包。我想知道我是否应该使用PacketCollector,或者如果监听器以某种方式死亡。有谁知道为什么这不会收到数据包?任何关于这个主题的知识将不胜感激!
答案 0 :(得分:2)
如果您的其他数据包侦听程序正在抛出异常,则会发生这种情况 每当一个数据包进入某个线程中的所有数据包侦听器的命中时,就会出现一个for循环内部的数据包。如果在数据包侦听器中抛出异常,则会中止该线程,并且不会触发其他数据包侦听器。
检测这种情况的最彻底的方法是重新编译smack并在PacketReader.java
中添加错误处理程序。
以下是相关的代码部分。您可以看到抛出的任何异常都会导致线程中止,因为没有错误处理。
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 :(得分:1)
我认为PacketIDFilter正在过滤数据包,因此您的数据包侦听器无法获取它们。
当您的数据包侦听器未获取数据包时,请检查smack日志以查看数据包ID是否是数据包过滤器所期望的。