Smack消息监听器未被调用且连接不稳定。

7
我有以下代码,应该监听消息:
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变量,它是正确的。问题在于监听器不能触发。更奇怪的是,有时它可以正常工作。

我还有另一个问题,就是无法发送消息。

在这里,我像上面一样设置聊天,并使用以下代码发送消息:

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);  
    }  
}  

现在经常会弹出“无法发送消息”的提示,所以显然我没有连接,也无法重新连接?

那么我该如何使我的连接更加稳定,并确保我的消息能够被发送?

2个回答

3

在调用connect()之前准备你的连接,请将ChatManagerListener添加到Connection中。这样可以确保每个新的聊天都会调用chatCreated方法。在chatCreated方法内,将一个ChatMessageListener添加到所传递进来的Chat中,以便于每次该聊天中有消息时都会调用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();        
}

2
我认为你需要像这样更新你的代码:-
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; 希望它能正常工作。


嗯,这可能是一个有趣的改变。目前它确实能工作,但存在一些错误。也许这样会更好。我会试一下。 - Gooey
我刚试了一下,这是做不到的。addMessageListener()需要一个ChatMessageListener - Gooey
这段代码是我的最后一个聊天应用程序代码,可以触发聊天消息! :) - pRaNaY
你的聊天对象是什么实例?你正在运行哪个版本的Smack? - Gooey
@Gooey,我遇到了你提到的同样的问题,即addMessageListener()需要一个ChatMessageListener。如果你找到了解决方案,请告诉我。 - ErShani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接