Smack прослушиватель сообщений не вызван и нестабильное соединение

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

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="test@app.buur.nu/Smack" type="chat" id="53" from="testje@app.buur.nu/Gajim"><body>test</body><request xmlns="urn:xmpp:receipts"/><thread>277945c1-772a-4d4b-8e1a-274153cfb8a6</thread></message>

Таким образом, сообщение получено. Я проверил, и otherJabberId переменная 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); } } 

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

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

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

 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; Надеюсь, его работа.

При подготовке вашего соединения (до того, как вы вызвали connect ()), добавьте ChatManagerListener в Connection. Это гарантирует, что 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(); }