XMPP:Asmack Connection PacketListener问题...

时间:2011-05-02 06:07:14

标签: android xmpp smack asmack

我正在使用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 个答案:

答案 0 :(得分:5)

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

由于

答案 1 :(得分:2)

我不确定我是否对您的应用结构有完整的概述,但为什么不在适当的时候致电XMPPConnection.removePacketListener()

答案 2 :(得分:2)

我遇到了同样的问题。这就是我做的,

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

答案 3 :(得分:1)

您不应在活动生命周期中注册监听器。而是创建一个Connection控制器的单例并将该侦听器添加到该控制器中。

答案 4 :(得分: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()中取消注册