2012-08-15 25 views
6

Sto usando asmack per un'applicazione IM Android, dove sto usando il servizio remoto con l'interfaccia AIDL.come gestire la connessione keep alive in servizio Android

All'interno del metodo onStartCommand del mio servizio, scrivo il codice come di seguito. Creo la connessione e quindi eseguo l'accesso utilizzando quello. Quando qualcuno esegue la mia applicazione all'interno del metodo onCreate dell'attività principale della mia applicazione, esegui il mio servizio getApplicationContext.StartService(serviceIntent). Sta funzionando bene, ma dopo pochi minuti (a volte 10 minuti e qualche volta più di dieci) messageListener che allego all'interno del servizio si ferma per ricevere messaggi. Ma so che la connessione esiste, perché allo stesso tempo io uso xmppConnection per inviare un messaggio che sta inviando un messaggio all'utente B ma non ascolta i messaggi dell'utente B. Non so perché il mio ascoltatore smetta di sentire il messaggio.

public int onStartCommand(final Intent intent, final int flags, final int startId) { 
    ConnectionConfiguration config = new ConnectionConfiguration(URL, MyPort, Host); 
    xmppConnection = new XMPPConnection(config); 
    xmppConnection.connect(); 
    xmppConnection.login("[email protected]", "testpass"); 
    xmppConnection.addPacketListener(myMessageListener, new PacketTypeFilter(Message.class)); 
    return START_STICKY; 
} 
private PacketListener myMessageListener = new PacketListener() { 
    public void processPacket(Packet packet) { 
     Message msg = (Message) packet; 
    } 
} 

Guida.

+0

Si prega di formattare il codice e scegliere un buon titolo per il tuo post. – Flow

+0

Il problema è che la mia connessione esiste ma si ferma ad ascoltare il pacchetto. Con questa connessione chiamo sendPacket che funziona bene ma non so perché si ferma ad ascoltare il pacchetto in arrivo. Controllo il mio servizio anche in esecuzione al backend perché posso inviarePacket da servizio per inviare pacchetti di messaggi, per favore guida. Sto affrontando lo stesso problema come pubblicato sul link sottostante. http://stackoverflow.com/questions/5040852/packet-listener-in-android-service – aftab

+0

Il tuo link postato sembra essere risposta ----> http://stackoverflow.com/questions/5040852/packet-listener -in-android-service – sascha10000

risposta

4

La connessione viene chiusa per errore senza che tu te ne accorga? È necessario aggiungere un listener di connessione e un registro per ogni richiamata per eseguire il debug dello stato della connessione.

Su Android è possibile avere una presa "zombie": è ancora possibile scrivere su di essa, ma il destinatario non riceverà mai i messaggi e, naturalmente, non sarà in grado di leggere i nuovi messaggi da esso. Può succedere dopo un cambio di stato della rete.

Per rilevare che uso XMPP Ping, avviato dal client da un allarme (ogni 15 minuti con inesatta ripetizione). E disabilito lo spazio bianco per tenerlo in vita. Ciò annulla la maggior parte dei meccanismi di timeout che possono esistere tra il client e il server (NAT o proxy). Inoltre, se non si riceve alcuna risposta al ping (ad esempio entro 20 secondi), è possibile presumere che la connessione sia in uno stato negativo e riconnettersi manualmente.

+0

Caro Guillaume Perrot: grazie per la tua risposta. Sto affrontando uno strano problema. Sto usando il servizio AIDL per gestire la mia connessione keep alive. Invio e ricevo messaggi che funzionano correttamente. Ma usando l'oggetto XMPP invio la richiesta di invito all'abbonamento a un utente che invia il pacchetto di richiesta bene. Ma qui il problema è che il suo listener di pacchetti si ferma per ascoltare i pacchetti in arrivo. La stessa volta che provo a inviare pacchetti usando lo stesso oggetto xmpp che invia, ma ricevo stop per ascoltare il pacchetto in arrivo. Sembra disturbare il listener del pacchetto xmpp dopo aver inviato la richiesta di invito. Per favore guida. . – aftab

+0

La classe AndroidDebugger (ConsoleDebugger su Smack normale) può essere utilizzata per stampare ciò che viene effettivamente letto o scritto sul socket senza utilizzare l'API PacketListener. Dovresti controllare se ricevi i pacchetti nei log del debugger quando il listener smette di funzionare. –

Problemi correlati