#android #xmpp #smack #asmack
#Android #xmpp #удар #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);
Ответ №1:
@Vishal. Вы не должны добавлять этого прослушивателя ни в один из ваших файлов activity, просто добавьте этих прослушивателей в свою службу Android, которая должна постоянно работать с одним экземпляром.
Спасибо
Ответ №2:
У меня такая же проблема. Это то, что я сделал,
OnResume()
{
connection.removePacketListener(yourlistener);
}
Ответ №3:
Я не уверен, что у меня есть полный обзор структуры вашего приложения, но почему бы вам просто не вызвать XMPPConnection.removePacketListener() при необходимости?
Ответ №4:
Вы не должны регистрировать прослушиватель в своем жизненном цикле activity. Вместо этого создайте одноэлементный контроллер подключения и добавьте этот прослушиватель в этот контроллер.
Ответ №5:
Я думаю, что лучший способ — полагаться на 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()