2012-02-13 21 views
8

Estoy tratando de crear una aplicación para Android que se comunica con un servidor local a través de un socket. La comunicación pasa comandos simples y datos en cadenas usando JSON. El cliente debe escuchar constantemente los mensajes entrantes del servidor y actualizar la interfaz de usuario cuando se reciben nuevos datos.Android para escuchar los mensajes de socket del servidor

Así que he creado un servicio de red que es un servicio cota ejecuta en segundo plano. De mi actividad me enlace al servicio y recibo una instancia del objeto de servicio. El objeto de servicio contiene métodos de instancia que me permiten enviar comandos al servidor.

Mi problema es, ¿Cómo puedo activar mi servicio a escuchar constantemente por los mensajes del servidor sin bloquear la posibilidad de enviar mensajes al servidor?

private Socket socket = null; 
private PrintWriter out = null; 
private BufferedReader in = null; 

private Listener listener; 

private String host = "10.0.1.4"; 
private int port = 3000; 

public NetworkService() 
{ 
    try { 

     if (socket == null) 
     { 
     socket = new Socket(this.host, this.port); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } 

     if(listener == null) 
     { 
      listener = new Listener(); 
      Thread thread = new Thread(listener); 
      thread.start(); 
     } 

     } catch (Exception e) { 
      // ... 
     } 
    } 
} 

public class Listener implements Runnable 
{ 

    @Override 
    public void run() { 

     try { 
      String line = null; 

      while((line = in.readLine()) != null) 
       { 
       // Do something. Never gets here 

       } 
      } catch (Exception e) { 
       // ... 
      } 

     } 

    } 
+0

A lo que se refiere. ¿Desea que se ejecute este proceso cuando la aplicación se está ejecutando o durante un cierto período de tiempo o cuando la aplicación está en modo silencioso (cuando la aplicación está ejecutándose en segundo plano) ... – Sniper

+0

Bueno, necesito que el servicio esté disponible siempre que estoy usando la aplicación. Necesito poder enviar comandos de cadena simples al servidor, y necesito poder recibir datos del servidor. –

+0

¿Desea obtener el servidor de formulario de respuesta hasta el final de su aplicación o durante un período de tiempo determinado? – Sniper

Respuesta

4

Puede crear en su Servicio un hilo para escuchar el servidor. El segundo hilo es para enviar comandos. Luego, para su servicio, debe crear un hilo principal con controlador en él. Este controlador procesará los mensajes de estos dos hilos.

+0

Este fue mi primer pensamiento también. Traté de iniciar un nuevo hilo en el constructor para mi servicio con un ciclo while blocking con una línea de lectura en el inputstream, sin embargo el ciclo while parece terminar instantáneamente. Por favor, consulte mis ediciones –

+0

Bien, así que borré todo e intenté este enfoque nuevamente. Ahora funciona. –

Cuestiones relacionadas