2015-10-31 25 views
5

ho il seguente codice che dovrebbe ascoltare i messaggi:Smack messaggio ascoltatore non chiama e la connessione instabile

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

Ma il mio registro non innesca.

Tuttavia, ho setDebuggerEnabled(true) nel mio codice e il seguente presenta: 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>

Quindi il messaggio viene ricevuto. Ho controllato e la variabile otherJabberId è corretta. È semplicemente l'ascoltatore che non si attiva. Ciò che è ancora più strano, a volte funziona perfettamente.

Un altro problema che ho non è in grado di inviare messaggi.

Qui, ho la messa a punto chat come sopra e utilizzare il seguente codice per inviare un messaggio:

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

E il brindisi con il "non poteva inviare il messaggio" schiocca-up di tanto in tanto. Quindi apparentemente non sono connesso e non riesco a riconnetterlo?

Quindi, come posso rendere la mia connessione più stabile e assicurarmi che i miei messaggi vengano inviati?

risposta

2

Penso che è necessario per modificare i tuoi codice come questo: -

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

Change ChatMessageListener()-MessageListener(), dove MessageListener() è questo ->org.jivesoftware.smack.MessageListener; spero proprio lavoro.

+0

Hmmm potrebbe essere un cambiamento interessante. Funziona attualmente, ma è piuttosto buggato. Forse questo sarà migliore. Lo proverò. – Gooey

+0

Ho appena provato e questo non può essere fatto. '' addMessageListener() '' si aspetta un '' ChatMessageListener''. – Gooey

+0

Questo codice è il mio ultimo codice della chat che funziona per il messaggio di chat di trigger! :) – pRaNaY

2

Quando si prepara la connessione (prima di chiamare connect()) aggiungere un ChatManagerListener alla connessione. Questo assicura che chatCreated venga chiamato una volta per ogni nuova chat. All'interno del metodo chatCreated aggiungere uno ChatMessageListener alla Chat inoltrata; in modo che processMessage venga chiamato ogni volta che c'è un messaggio in quella 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) { } 
      }); 
    } 
}); 

Per quanto riguarda i problemi di connessione, si potrebbe desiderare di aggiungere un org.jivesoftware.smack.ConnectionListener per la connessione in modo da poter sfruttare al fallimento un po 'più trasparente. Si potrebbe anche provare a garantire che il comportamento di riconnessione automatica sia abilitato.

ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(mConnection); 
if (!reconnectionManager.isAutomaticReconnectEnabled()) { 
    reconnectionManager.enableAutomaticReconnection();   
} 
Problemi correlati