没有调用Smack消息监听器和连接不稳定

时间:2015-10-31 14:50:40

标签: android xmpp listener 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变量是否正确。只是听众没有触发。什么更奇怪,有时它只是工作正常。

我遇到的另一个问题是无法发送消息。

在这里,我有如上所述的聊天设置,并使用以下代码发送消息:

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

&#34;的祝酒词无法发送消息&#34;不时弹出。显然我没有连接,我也无法重新连接?

那么如何让我的连接更稳定并确保我的消息被发送?

2 个答案:

答案 0 :(得分: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; 我希望它的工作。

答案 1 :(得分:2)

准备连接时(在调用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();        
}