XMPP: проблема Asmack Connection PacketListener

Я использую 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);

person Vishal Khakhkhar    schedule 02.05.2011    source источник


Ответы (5)


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

Спасибо

person Gaurav Arora    schedule 11.03.2013

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

OnResume()
{
connection.removePacketListener(yourlistener);
}
person user2285285    schedule 19.04.2013

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

person Flow    schedule 02.05.2011

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

person Muhammad Aamir Ali    schedule 29.08.2014

Я думаю, что лучше полагаться на ChatManager для управления вашими чатами, отправки и получения чатов, что я делаю в своем приложении:

// Assume we've created a Connection name "connection".
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("[email protected]",
 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()

person Ahmed Aswani    schedule 28.12.2011