我正在尝试为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));
请注意,这是在asInctask的doInBackground(string … params)部分内部.
数据包正在使用以下方式发送:
JIDIQ.setPacketID(lastCustomIQId); JIDIQ.setFrom(XMPPMethods.getCurrentUserFullUserName()); JIDIQ.setType(Type.GET); XMPPMethods.getConnection().sendPacket(JIDIQ);
JIDIQ是一个asmack IQ.这段代码大部分时间都正确运行.但有时PacketListener只是没有收到发送的数据包.我想知道我是否应该使用PacketCollector,或者如果监听器以某种方式死亡.有谁知道为什么这不会收到数据包?任何有关此主题的知识将不胜感激!
解决方法
如果您的其他数据包侦听器正在抛出异常,则会发生这种情况.
每当一个数据包进入某个线程中的所有数据包侦听器的命中时,就会出现一个for循环内部的数据包.如果在数据包侦听器中抛出异常,则会中止该线程,并且不会触发其他数据包侦听器.
每当一个数据包进入某个线程中的所有数据包侦听器的命中时,就会出现一个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); } } }