用smack作一个xmpp客户端彷佛是一件很简单的事情。可是前几天发现的一个bug,仍是让我思考了不少。java
用smack创建一个xmpp connection。而后在connection 上注册了一个PacketListener。app
可是程序里面在一个for循环里面去new PakcetListener,并把listener注册到connection上面。这样致使的结果就是this
smack客户端收到许多相同的IQ response。code
若是稍微看一下smack的源代码就明白问题出在哪里。it
smack connection class:io
/** * Registers a packet listener with this connection. A packet filter determines * which packets will be delivered to the listener. If the same packet listener * is added again with a different filter, only the new filter will be used. * * @param packetListener the packet listener to notify of new received packets. * @param packetFilter the packet filter to use. */ public void addPacketListener(PacketListener packetListener, PacketFilter packetFilter) { if (packetListener == null) { throw new NullPointerException("Packet listener is null."); } ListenerWrapper wrapper = new ListenerWrapper(packetListener, packetFilter); recvListeners.put(packetListener, wrapper); }
/** * List of PacketListeners that will be notified when a new packet was received. */ protected final Map<PacketListener, ListenerWrapper> recvListeners = new ConcurrentHashMap<PacketListener, ListenerWrapper>();
看完上面这两段代码,就知道了。若是重复注册listener。其实就意味着一个packet会被notify屡次。for循环
程序就回出现一些奇怪的现象。class