2012-08-15 31 views
6

Estoy usando asmack para una aplicación de IM de Android, donde estoy usando el servicio remoto con la interfaz AIDL.cómo manejar la conexión keep alive en android Service

Dentro de onStartCommand método de mi servicio escribo el código como a continuación. Creo conexión y luego inicio sesión usando eso. Cuando alguien ejecuta mi aplicación dentro del método onCreate de la actividad principal de mi aplicación ejecuta mi servicio getApplicationContext.StartService(serviceIntent). Está funcionando bien, pero después de unos minutos (a veces 10 minutos y un tiempo más de diez) messageListener que adjunto dentro del servicio se detiene para recibir mensajes. Pero sé que la conexión existe, porque al mismo tiempo que uso xmppConnection para enviar un mensaje, está enviando un mensaje al usuario B pero no escucha mensajes del usuario B. No sé por qué mi oyente deja de escuchar el mensaje.

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

Por favor guía.

+0

Formatee su código y elija un buen título para su publicación. – Flow

+0

El problema es que mi conexión existe pero se detiene para Escuchar el paquete.utilizando esa conexión Yo llamo a sendPacket que funciona bien pero no sé por qué se detiene para escuchar el paquete entrante. Compruebo que mi servicio también se ejecuta en backend porque puedo enviarPaquete desde servicio para enviar el paquete de mensajes, por favor guía. Me enfrenta el mismo problema que se publica en el siguiente enlace. http://stackoverflow.com/questions/5040852/packet-listener-in-android-service – aftab

+0

Parece que se ha respondido su enlace publicado ----> http://stackoverflow.com/questions/5040852/packet-listener -in-android-service – sascha10000

Respuesta

4

¿Su conexión está cerrada por error sin que se dé cuenta? Debe agregar un oyente de conexión y un registro para cada devolución de llamada para depurar el estado de la conexión.

En Android es posible tener un socket "zombie": aún puede escribir en él, pero el destinatario nunca recibirá los mensajes y, por supuesto, no podrá leer nuevos mensajes. Puede suceder después de un cambio en el estado de la red.

Para detectar que utilizo XMPP Ping, iniciado desde el cliente desde una alarma (cada 15 minutos con repetición inexacta). E inhabilito el espacio en blanco para mantenerme vivo. Esto elimina la mayoría de los mecanismos de tiempo de espera que pueden existir entre su cliente y su servidor (NAT o proxies). Además, si no recibe ninguna respuesta al ping (dentro de los 20 s por ejemplo), puede suponer que la conexión está en mal estado y reconectarse manualmente.

+0

Estimado Guillaume Perrot: gracias por su respuesta. Estoy enfrentando un problema extraño. Estoy usando el servicio AIDL para manejar mi conexión de mantener vivo. Estoy enviando y recibiendo mensajes que funcionan bien. Pero al usar el objeto XMPP, envío una solicitud de invitación a la suscripción a un usuario que envía un paquete de solicitud bien. Pero aquí viene el problema de que su oyente de paquetes se detenga para escuchar los paquetes entrantes. La misma vez que trato de enviar un paquete usando el mismo objeto xmpp, envía bien pero recibe detener para escuchar el paquete entrante. Parece que el paquete de escucha xmp molesta después de enviar la solicitud de invitación. Por favor guía. . – aftab

+0

La clase AndroidDebugger (ConsoleDebugger en Smack regular) se puede utilizar para imprimir lo que realmente se lee o escribe en el socket sin utilizar la API PacketListener. Debería verificar si recibe paquetes en los registros del depurador cuando su oyente deja de funcionar. –

Cuestiones relacionadas