XMPP:Asmack连接PacketListener问题

4
我正在使用asmack API进行Android XMPP集成...
在成功认证xmpp连接后,我使用PacketListener来接收传入消息通知。
我的应用程序是基于选项卡的应用程序。当我通过点击好友列表移动到聊天活动时,在OnCreate方法中将我的数据包侦听器添加到连接中。
问题是,每次我移动到此屏幕,都会添加相同数量的侦听器,并多次收到相同的消息。
有解决此问题的方法吗?
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        PacketListener pListener = new PacketListener() {
            public void processPacket(Packet packet) {
                Message message = (Message) packet;
                if (message.getBody() != null) {
                    String fromName = StringUtils.parseBareAddress(message
                            .getFrom());
                    Log.i("XMPPClient", "Got text [" + message.getBody()
                            + "] from [" + fromName + "]");
                    messages.add(fromName + ":");
                    messages.add(message.getBody());
                    // Add the incoming message to the list view
                    mHandler.post(new Runnable() {
                        public void run() {
                            setListAdapter();
                        }
                    });
                }
            }
        };

        connection.addPacketListener(pListener, filter);
5个回答

5
@Vishal。您不应该在任何活动文件中添加此监听器,只需将这些监听器添加到Android服务中,该服务应始终以单个实例运行。

谢谢


2

2

我遇到了同样的问题。这是我所做的:

OnResume()
{
connection.removePacketListener(yourlistener);
}

1
你不应该在活动生命周期中注册监听器。相反,创建一个连接控制器的单例,并将此监听器添加到该控制器中。

0

我认为更好的方法是依赖于ChatManager来管理您的聊天,发送和接收聊天。这是我在我的应用程序中所做的:

// Assume we've created a Connection name "connection".
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com",
 new MessageListener() {
    public void processMessage(Chat chat, Message message) {
        System.out.println("Received message: " + message);
    }
});

try {
    newChat.sendMessage("Howdy!");
}
catch (XMPPException e) {
    System.out.println("Error Delivering block");
}

接收您所述消息

// Assume a MessageListener we've setup with a chat.

    public void processMessage(Chat chat, Message message) {
        // Send back the same text the other user sent us.
        chat.sendMessage(message.getBody());
    }

监听其他传入的聊天

// Assume we've created a Connection name "connection".
ChatManager chatmanager = connection.getChatManager().addChatListener(
    new ChatManagerListener() {
        @Override
        public void chatCreated(Chat chat, boolean createdLocally)
        {
            if (!createdLocally)
                chat.addMessageListener(new MyNewMessageListener());;
        }
    });

这将比数据包过滤器更加清晰

为避免多个事件监听器注册,请在onResume()方法中注册您的监听器,然后在onPause()中取消注册。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接