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?
- Algún tipo de cola para asynctask
- ¿Cómo usar la intención en la clase Asynctask?
- Error de "no incluir instancia de tipo" al llamar al método de otra clase en Android
- Android usando Renderscript para efectos de desenfoque falla causas A / libc: Fatal señal 7 (SIGBUS), código 2, error addr 0x9e6fa000 en tid 482 (AsyncTask # 1)
- Mantenga la conexión de socket entre actividades en android
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);
- Nombrar AsyncTask para crear perfiles en Android
- Fuerza detener un bloqueo de lectura AsyncTask
- AsyncTask cargando la imagen RecyclerView
- Reproducción de vídeo desde el servidor http en android
- AsyncTask acceder a la base de datos - ¿Dónde inicializar, cerrar?
- Diferencias entre SwingWorker de Java y Android AsyncTask
- Sockets and asynctask de Android
- Cómo obtener el progreso de un IntentService
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
.
- Nexus 5 (Kitkat 4.4) no autorizará mi equipo con Windows 8
- Advertencia de Android Studio cuando se utiliza PackageManager.GET_SIGNATURES