XMPP: проблема со списком пакетов подключения к Asmack…

#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()