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);
4

5 回答 5

5

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

谢谢

于 2013-03-11T05:36:14.993 回答
2

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

OnResume()
{
connection.removePacketListener(yourlistener);
}
于 2013-04-19T18:26:24.663 回答
2

我不确定我是否对您的应用程序的结构有一个完整的概述,但是您为什么不在适当的时候简单地调用XMPPConnection.removePacketListener()呢?

于 2011-05-02T08:28:22.443 回答
1

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

于 2014-08-29T13:22:37.370 回答
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()

于 2011-12-28T14:57:23.043 回答