I am profiling my XMPP client looking for memory leaks. I have found that XMPPConnection.removePacketListener(PacketListener listener) does not remove the listener.
XMPPConnection.addPacketListener(PacketListener listener) calls PacketReader.addPacketListener(). PacketReader wraps the PacketListener in a ListenerWrapper object and adds this to a collection of PacketListeners. But, when removePacketListener(PacketListener listener) is called, PacketReader attempts to remove the listener and not the ListenerWrapper instance. The listener is not found and thus not removed.
Pony
Here is a work around that I coded:
/**
* Removes a packet listener.
*
* @param packetListener the packet listener to remove.
*/
public void removePacketListener(PacketListener packetListener) {
ListenerWrapper wrapperToRemove = null;
for (Iterator listenerIt = listeners.getIterator(); listenerIt.hasNext();) {
ListenerWrapper wrapper = (ListenerWrapper) listenerIt.next();
if (wrapper.packetListener == packetListener) {
cancelPacketCollector(wrapper.packetCollector);
wrapperToRemove = wrapper;
break;
}
}
if (wrapperToRemove != null) {
cancelPacketCollector(wrapperToRemove.packetCollector);
listeners.remove(wrapperToRemove);
}
//listeners.remove(packetListener);
}
Message was edited by: PouncePony