Сбой прослушивателя сообщений не вызван, а соединение неустойчиво

У меня есть следующий код, который должен прослушивать сообщения:

ChatManager chatmanager = ChatManager.getInstanceFor(xmppManager.getConnection());

chat = chatmanager.createChat(otherJabberId);

chat.addMessageListener(new ChatMessageListener() {
    @Override
    public void processMessage(Chat chat, Message message) {
        Log.e("message trigger", message.getBody());
    }
}

Но мой журнал никогда не запускается.

Однако у меня есть setDebuggerEnabled(true) в моем коде, и появляется следующее: 10-31 15:41:51.264 28889-28993/com.lfdversluis.buurapp D/SMACK: RECV (0): <message to="[email protected]/Smack" type="chat" id="53" from="[email protected]/Gajim"><body>test</body><request xmlns="urn:xmpp:receipts"/><thread>277945c1-772a-4d4b-8e1a-274153cfb8a6</thread></message>

Итак, сообщение получено. Я проверил, и переменная otherJabberId верна. Просто слушатель не запускается. Что еще более странно, иногда это просто отлично работает.

Другая проблема, которую я имею, не может отправлять сообщения.

Здесь у меня есть настройка чата, как указано выше, и используйте следующий код для отправки сообщения:

try {  
    chat.sendMessage(text.trim());  
    DataBaseManager db = new DataBaseManager(ChatActivity.this);  
    db.addMessageToDB(model);  

    addMessageToScreen(newMessage);  

} catch (SmackException.NotConnectedException ignored) {  
    XMPPManager manager = XMPPManager.getInstance();  
    manager.reconnect(); // Maybe we need to reconnect due to an interrupt and retry..  
    try {  
        chat.sendMessage(text.trim());  
        DataBaseManager db = new DataBaseManager(ChatActivity.this);  
        db.addMessageToDB(model);  
        addMessageToScreen(newMessage);  
    } catch (SmackException.NotConnectedException e) {  
        e.printStackTrace();  
        Toasteroid.show(ChatActivity.this, "Could not send message. Please try again.", Toasteroid.STYLES.ERROR);  
    }  
}  

И тосты с "не могли отправлять сообщения" время от времени всплывали. Так что, видимо, я не подключен, и я не могу снова подключиться?

Итак, как я могу сделать мое соединение более стабильным и убедиться, что мои сообщения отправлены?

Ответ 1

Я думаю, вам нужно обновить код следующим образом: -

chat.addMessageListener(new MessageListener() {
                 public void processMessage(Chat chat, Message message) {
                     System.out.println("Received message: "
                             + (message != null ? message.getBody() : "NULL"));
                 }
             });

Измените ChatMessageListener() на MessageListener(), где MessageListener() - это → org.jivesoftware.smack.MessageListener; Я надеюсь на его работу.

Ответ 2

При подготовке вашего соединения (до того, как вы вызвали connect()), добавьте в Connection ЧатManagerListener. Это гарантирует, что chatCreated вызывается один раз для каждого нового чата. В рамках метода chatCreated добавьте ChatMessageListener в чат, который передается; так что processMessage вызывается каждый раз, когда появляется сообщение в этом чате.

ChatManager.getInstanceFor(mConnection).addChatListener(chatManagerListener);

ChatManagerListener chatManagerListener = new ChatManagerListener() {
    @Override
    public void chatCreated(Chat chat, boolean createdLocally) {
        chat.addMessageListener(
            new ChatMessageListener() {
                @Override
                public void processMessage(Chat chat, Message message) { }
            });
    }
});

Что касается проблем с подключением, вы можете добавить к своему серверу org.jivesoftware.smack.ConnectionListener, чтобы сделать его более прозрачным. Вы также можете попытаться обеспечить автоматическое повторное подключение.

ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(mConnection);
if (!reconnectionManager.isAutomaticReconnectEnabled()) {
    reconnectionManager.enableAutomaticReconnection();        
}