smack PacketListener的总结

    用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

相关文章
相关标签/搜索