2011-03-24 12 views
15

Estoy desarrollando esta aplicación y necesito en algún momento enviar datos (dobles y cadenas en su mayoría) a un servidor. Utilizaré socket TCP y DataOutput/InputStreams. Me preguntaba cuál sería la mejor manera de hacer esto. ¿Debo tener una clase separada para manejar la conexión con los métodos de escritura/lectura implementados o tal vez simplemente definir Sockets/Streams, etc. en mi clase principal de actividad en onCreate()? ¿Es la primera manera posible? Cualquier ejemplo sería apreciado.manera correcta de usar sockets en la aplicación de Android

ps. ¿Debo usar un hilo diferente para manejar la conexión?

editar.
Así que si lo tengo derecho, esto debe ser correcta:

public class ConnectionHandler extends AsyncTask<Void, Void, Void>{ 

public static String serverip = "192.168.1.100"; 
public static int serverport = 7777; 
Socket s; 
public DataInputStream dis; 
public DataOutputStream dos; 
public int message; 

@Override 
protected Void doInBackground(Void... params) { 

    try { 
     Log.i("AsyncTank", "doInBackgoung: Creating Socket"); 
     s = new Socket(serverip, serverport); 
    } catch (Exception e) { 
     Log.i("AsyncTank", "doInBackgoung: Cannot create Socket"); 
    } 
    if (s.isConnected()) { 
     try { 
      dis = (DataInputStream) s.getInputStream(); 
      dos = (DataOutputStream) s.getOutputStream(); 
      Log.i("AsyncTank", "doInBackgoung: Socket created, Streams assigned"); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected"); 
      e.printStackTrace(); 
     } 
    } else { 
     Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed"); 
    } 
    return null; 
} 

public void writeToStream(double lat, double lon) { 
    try { 
     if (s.isConnected()){ 
      Log.i("AsynkTask", "writeToStream : Writing lat, lon"); 
      dos.writeDouble(lat); 
      dos.writeDouble(lon); 
     } else { 
      Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed"); 
     } 
    } catch (Exception e) { 
     Log.i("AsynkTask", "writeToStream : Writing failed"); 
    } 
} 

public int readFromStream() { 
    try { 
     if (s.isConnected()) { 
      Log.i("AsynkTask", "readFromStream : Reading message"); 
      message = dis.readInt(); 
     } else { 
      Log.i("AsynkTask", "readFromStream : Cannot Read, Socket is closed"); 
     } 
    } catch (Exception e) { 
     Log.i("AsynkTask", "readFromStream : Writing failed"); 
    } 
    return message; 
} 

} 

y me gustaría utilizar algo como esto en mi clase Actividad:

ConnectionHandler conhandler = new ConnectionHandler(); 
    conhandler.execute(); 
    conhandler.writeToStream(lat , lon); 

Respuesta

16

Dado que las conexiones de red puede ocupar el tiempo y hacer que su la aplicación no responde si está hecha en el hilo de la interfaz de usuario, probablemente debería hacerlas en un AsyncTask. Si su AsyncTask es suficientemente complejo, podría valer la pena implementarlo en su propio archivo java como una clase pública adecuada.

This answer le daría el esqueleto básico. AsyncTask hace que sea fácil interactuar con la IU al principio y al final de la carga de fondo, si es necesario que muestre alguna indicación de progreso.

Thread tiende a ser una opción peor, ya que aún le queda el problema de la interacción de la interfaz de usuario cuando se completa el hilo, así como asegurarse de que el hilo no continúa su trabajo una vez que termina su actividad; También se puede cancelar un AsyncTask y luego se ejecutará onCancelled en lugar de onPostExecute.

+1

Ah, genial, estaba pensando más en el enhebrado tradicional, miraré más en AsyncTask y volveré si tengo alguna pregunta. Gracias. – kotsosh

+1

También acabo de encontrar este ejemplo para cualquier persona interesada: http://stackoverflow.com/questions/5135438/example-android-bi-directional-network-socket-using-asynctask – kotsosh

Cuestiones relacionadas