2012-04-04 30 views
6

Mi aplicación tiene algunas actividades que en la primera conecto un socket para comunicarme con un servidor sobre las demás actividades. Este socket se ejecuta en un hilo de trabajo.Cerrar socket al finalizar la aplicación

Mi pregunta es: ¿dónde puedo cerrar este conector cuando la aplicación está terminando? Usando el botón BACK por ejemplo ...

Pensé cerrar el socket en onDestroy() de la última actividad pero esta actividad puede ser destruida por el sistema en tiempo de ejecución y cerrar el socket incluso si la aplicación no está terminando. No quiero esto

Mi método de la manipulación de la conexión de socket hilo run() es como:

public void run() { 
    if (this.bliveclient.isConnected()){  
     try { 
      //... 
      while (running) { 
       //waiting for input data and do something... 
      } 
     } 
     catch (IOException ex) { 
      //handle exception 
     } 
     finally{ 
      try { 
       mySocket.close(); 
      } catch (IOException ex) { 
       //handle exception 
      } 
     } 
    } 

Pero el bloque finally nunca es llamado.

¿Alguien me puede dar alguna pista?

+0

nunca dejas de 'ejecutar' o el hilo se mata. El manejo de red requerido por múltiples actividades parece ser un buen lugar para moverlo a un servicio. – zapl

+0

@zapl, la conexión TCP funciona bien. Puedo recibir y enviar datos correctamente ... Mi único problema es cerrar el socket, porque el servidor también necesita cerrar este socket. – amp

Respuesta

4

El bloque finally nunca se ejecuta porque el ciclo de ejecución nunca se completa. En algún momento, Android simplemente mata el proceso, que mata a la máquina virtual y todo simplemente desaparece.

Si tiene una aplicación que solo contiene actividades y está haciendo E/S de red en un hilo separado, entonces no hay forma de que sepa cuándo cerrar el hilo porque la "aplicación" nunca está "terminada" . Debe definir cómo la aplicación "finaliza".

Una mejor manera es poner esto en un servicio, porque si Android quiere matar el proceso, primero llamará a onDesy() en el servicio, lo que le dará la oportunidad de cerrar el hilo correctamente.

Cuestiones relacionadas