【问题标题】:Smack message listener not called and connection unstable未调用 Smack 消息侦听器且连接不稳定
【发布时间】:2016-01-31 21:02:27
【问题描述】:

我有以下代码应该监听消息:

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

并且时不时会弹出带有“无法发送消息”的吐司。所以显然我没有连接,我也无法重新连接?

那么我怎样才能使我的连接更稳定并确保我的消息被发送?

【问题讨论】:

    标签: android xmpp listener smack


    【解决方案1】:

    在准备连接时(在调用 connect() 之前)将 ChatManagerListener 添加到连接。这可确保为每个新聊天调用一次 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; 我希望它的工作。

      【讨论】:

      • 嗯,这可能是一个有趣的变化。它目前确实有效,但它相当有问题。也许这会更好。我会试试看。
      • 我刚试了下,不行。 addMessageListener() 需要 ChatMessageListener
      • 此代码是我的最后一个聊天应用程序代码,用于触发聊天消息! :)
      • 你的聊天对象是什么实例,你运行的是哪个版本的 smack?
      • @Gooey 我面临同样的问题,你说 addMessageListener() 需要一个 ChatMessageListener。如果您有解决方案,请告诉我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多