我正在使用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);
答案 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()
中取消注册