Android Smack消息侦听器未调用且连接不稳定

Android Smack消息侦听器未调用且连接不稳定,android,xmpp,listener,smack,Android,Xmpp,Listener,Smack,我有以下代码可以侦听消息: ChatManager chatmanager = ChatManager.getInstanceFor(xmppManager.getConnection()); chat = chatmanager.createChat(otherJabberId); chat.addMessageListener(new ChatMessageListener() { @Override public void processMessage(Chat cha

我有以下代码可以侦听消息:

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):test277945c1-772a-4d4b-8e1a-274153cfb8a6

因此消息被接收。我已经检查过,
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。这确保了每次新聊天时都会调用一次创建的聊天室。在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();        
}

嗯,这可能是一个有趣的变化。它目前确实可以工作,但它有相当多的缺陷。也许这样会更好。我会试试的。我只是试了一下,但这是做不到的
addMessageListener()
需要一个
ChatMessageListener
。此代码是我最后一个用于触发聊天信息的聊天应用程序代码!:)您的聊天对象是哪个实例,您运行的是哪个版本的smack?@Gooey我面临的问题与您所说的addMessageListener()需要一个ChatMessageListener相同。如果你有解决办法,请让我知道