2015-10-31 5 views
5

Ich habe den folgenden Code, der für Nachrichten hören sollte:Smack Nachricht Hörer nicht genannt und Verbindung instabil

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

Aber mein Log nie auslöst.

Ich habe jedoch setDebuggerEnabled(true) in meinem Code und folgendes erscheint: 10-31 15:41:51.264 28889-28993/com.lfdversluis.buurapp D/SMACK: RECV (0): <message to="[email protected]/Smack" type="chat" id="53" from="[email protected]/Gajim"><body>test</body><request xmlns="urn:xmpp:receipts"/><thread>277945c1-772a-4d4b-8e1a-274153cfb8a6</thread></message>

So die Nachricht empfangen wird. Ich habe überprüft und die otherJabberId Variable ist korrekt. Es ist einfach der Zuhörer, der nicht auslöst. Was noch seltsamer ist, manchmal funktioniert es einfach gut.

Ein anderes Problem, das ich habe, ist nicht in der Lage, Nachrichten zu senden.

Hier habe ich den Chat-Setup wie oben und verwenden Sie den folgenden Code, um eine Nachricht zu senden:

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

Und den Toast mit der „nicht-Nachricht senden könnte“ Pops-up ab und zu. Offensichtlich bin ich nicht verbunden und ich kann auch nicht wieder verbinden?

Also wie kann ich meine Verbindung stabiler machen und sicherstellen, dass meine Nachrichten gesendet werden?

Antwort

2

Ich glaube, Sie müssen Sie Code wie folgt aktualisieren: -

chat.addMessageListener(new MessageListener() { 
       public void processMessage(Chat chat, Message message) { 
        System.out.println("Received message: " 
          + (message != null ? message.getBody() : "NULL")); 
       } 
      }); 

ändern ChatMessageListener()-MessageListener(), wo MessageListener() ist dies ->org.jivesoftware.smack.MessageListener; ich seine Arbeit hoffen.

+0

Hmmm das könnte eine interessante Änderung sein. Es funktioniert derzeit, aber es ist ziemlich fehlerhaft. Vielleicht wird das besser. Ich werde es ausprobieren. – Gooey

+0

Ich habe es gerade versucht und das kann nicht gemacht werden. '' addMessageListener() '' erwartet einen '' ChatMessageListener''. – Gooey

+0

Dieser Code ist mein letzter Chat-App-Code, der für die Auslöse-Chat-Nachricht funktioniert! :) – pRaNaY

2

Wenn Sie Ihre Verbindung vorbereiten (bevor Sie connect()) anrufen, fügen Sie der Verbindung einen ChatManagerListener hinzu. Dadurch wird sichergestellt, dass chatCreated einmal für jeden neuen Chat aufgerufen wird. Innerhalb der chatCreated Methode fügen Sie einen ChatMessageListener zu dem Chat, der übergeben wird; so dass processMessage jedes Mal aufgerufen wird, gibt es eine Nachricht in diesem Chat.

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

Wie für Ihre Verbindungsprobleme, Sie könnten einen org.jivesoftware.smack.ConnectionListener zu Ihrer Verbindung hinzufügen möchten, so dass Sie den Fehler ein bisschen transparenter machen. Sie können auch versuchen, sicherzustellen, dass das automatische Verbindungswiederherstellungsverhalten aktiviert ist.

ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(mConnection); 
if (!reconnectionManager.isAutomaticReconnectEnabled()) { 
    reconnectionManager.enableAutomaticReconnection();   
} 
Verwandte Themen