forma correcta de usar sockets en la aplicación android

Estoy desarrollando esta aplicación y necesito en algún momento enviar datos (dobles y strings en su mayoría) a un servidor. Voy a utilizar TCP socket 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 métodos de escritura / lectura implementados o tal vez sólo definir Sockets / Streams etc en mi clase de actividad principal en onCreate ()? ¿Es la primera manera incluso posible? Cualquier ejemplo sería apreciado.

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

editar.
Así que si lo tengo bien, esto debe ser correcto:

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 yo usaría algo como esto en mi clase de actividad:

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

Dado que las conexiones de red pueden tomar tiempo y hacer que su aplicación no responda si se realiza en el subproceso de interfaz de usuario, probablemente debería hacerlo en AsyncTask . Si su AsyncTask es suficientemente complejo, podría valer la pena implementarlo en su propio archivo java como una clase pública apropiada.

Esta respuesta le daría el esqueleto básico. AsyncTask facilita la interacción con la interfaz de usuario al principio y al final de la carga de fondo, si es necesario mostrar alguna indicación de progreso.

Thread tiende a ser una peor opción ya que todavía se queda con 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 después de su actividad termina; un AsyncTask también se puede cancelar y luego onCancelled se ejecutará en lugar de onPostExecute .

  • Android Asynctask para procesar tramas de video en vivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.