XMPP: проблема Asmack Connection PacketListener ... - PullRequest
4 голосов
/ 02 мая 2011

Я использую asmack api для интеграции Android XMPP ...

После успешной аутентификации для подключения xmpp я использовал PacketListener для уведомления о входящем сообщении.

Мое приложение - приложение на основе вкладок. Когда я перехожу в чат, нажимая на список друзей, мой прослушиватель пакетов добавляется к соединению методом OnCreate.

Проблема в том, что столько раз, сколько я перехожу на этот экран, добавляется количество слушателей и я получаю одно и то же сообщение несколько раз.

Anysolution для этой проблемы?

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 ]

5 голосов
/ 11 марта 2013

@ Вишал.Вы не должны добавлять этот прослушиватель ни в один из ваших файлов активности, просто добавьте эти прослушиватели в службу Android, которая должна постоянно работать с одним экземпляром.

Спасибо

2 голосов
/ 19 апреля 2013

У меня такая же проблема. Это то, что я сделал,

OnResume()
{
connection.removePacketListener(yourlistener);
}
2 голосов
/ 02 мая 2011

Я не уверен, что у меня есть полный обзор структуры вашего приложения, но почему бы вам просто не вызвать XMPPConnection.removePacketListener () , когда это необходимо?

1 голос
/ 29 августа 2014

Вы не должны регистрировать слушателя в жизненном цикле своей активности. Вместо этого создайте единственный контроллер подключений и добавьте этот прослушиватель в этот контроллер.

0 голосов
/ 28 декабря 2011

Я думаю, что лучший способ - это зависеть от 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()

...