socket example java android sockets socket.io android-lifecycle

socket.io java example



La mejor manera de implementar Socket.io en Android (4)

Estoy planeando implementar Socket.io en Android con this biblioteca para una aplicación basada en chat. Por lo que he entendido, la biblioteca parece ser bastante buena. ¿Quiero saber cómo mantener una conexión de socket único en toda la aplicación todo el tiempo? Aquí he enumerado maneras de lograr, en las que necesito la mejor y más estable.

Tres maneras

MainApplication Class extiende la aplicación

Por esto, tenemos un buen alcance de que la conexión de socket se mantenga en el hilo principal (o el ciclo de vida de la aplicación) y siempre que la instancia de socket se necesite de la actividad, podemos obtenerla fácilmente. Pero es el hilo principal que también el problema. Podría bloquear el hilo principal.

Servicio Bound

De esta manera podemos vincular el servicio con las actividades y simplemente podemos utilizarlo. Hacerlo en un hilo separado es la manera de lograr llamadas de IO / red. Pero la transferencia de procesamiento cruzado es más costosa que acceder directamente en el mismo proceso.

Semifallo

Mantener la conexión en Singleton también tiene sentido. Pero no sabemos cuándo se mata la instancia por proceso, porque no funciona en el ciclo de vida de la actividad.

Si tengo sentido por favor ayudame Si no lo comentamos.

Editar

He dado la respuesta que es más adecuada para mí.


Servicio para mantener la conexión del socket

Según lo mencionado por Ofek Ron, el Service con BroadcaseReceiver es una mejor idea que BoundService . Porque es un proceso tedioso para mantener la comunicación. Y también recomiendo pub/sub forma de transmisión, como Otto o EventBus (yo mismo sugiero Otto by Square, que es limpio y brillante api).

Pros de OTTO
1. Api limpiador
2. Puede suscribirse y publicar en / en cualquier clase de Activity , Fragment , Service .
3. desacoplamiento . (Tienes que acoplar lo menos posible en tu código).

Y un punto más es usar START_STICKY en onStartCommand() para iniciar el servicio después de que se destruya. Ver this referencia

MainApplication para iniciar el servicio

Se MainApplication iniciar el servicio en la MainApplication que amplía la Application . Debido a que la aplicación se eliminará cuando exista una restricción de memoria o el usuario cierre la aplicación de la pila a la fuerza. Por lo onStartCommand() , no se llamará con frecuencia a onStartCommand() como si lo hubiéramos implementado en Activity.

Implementando estado en línea

Puede implementar el estado en línea simplemente implementando Application.LifeCycleCallbacks en la clase MainApplication , que tiene la mayoría de las devoluciones de llamadas de actividad del ciclo de vida y se notificará en la devolución de llamada. De este modo, puede implementar el estado en Online simplemente sin ningún código de placa de caldera. (Si alguien necesita ayuda aquí hágamelo saber).

Subir o descargar imágenes o archivos.

La mejor práctica es implementar IntentService porque se está ejecutando en un subproceso separado. Prometo cuál dará el mejor rendimiento porque es manejado por el propio Android, no como los hilos creados por nosotros.


Antes de crear su propia implementación de un cliente socket.io, debe darle una oportunidad a esta biblioteca: https://github.com/socketio/socket.io-client-java

Lo uso en uno de mis proyectos para comunicarme con un servidor node.js que funciona bastante bien. En realidad, todas sus sugerencias son correctas y en su mayoría dependen de lo que desea lograr. Sin embargo, un contexto siempre está disponible: el contexto de la aplicación. Por lo tanto, debe mantener una instancia de singleton en la clase de Application y obtenerla mediante getApplicationContext() .

Estado en línea del usuario: aquí debe crear un servicio en segundo plano que esté escuchando constantemente el estado de los usuarios. Como no hay mucha información, esto debería estar bien y no debería agotar demasiado la batería. Además, puede enviar una bandera si hay nueva información disponible y solo si hay algo nuevo, inicia otro hilo, que está recibiendo los nuevos datos. Esto mantiene los datos bajos.

Chat: los datos del chat se transfieren solo cuando la aplicación está activa. Por lo tanto, esto debe hacerse en una actividad.

Tanto el servicio como la actividad pueden acceder a la instancia de singleton del cliente socket.io desde el contexto de la aplicación. Mientras no procese datos complejos en el hilo principal, todo está bien. Por lo tanto, envuelva sus llamadas en un hilo separado y comience solo cuando sean realmente necesarias.


Puedes combinar la primera y la tercera como:

Cree Socket en su Application y declare que son static . Para que pueda mantenerlos y acceder a ellos en cualquier lugar de su aplicación. No olvide crear ThreadPool separados para realizar las operaciones de red, puede usar ThreadPool para administrar esos Thread . Si desea actualizar su UI desde esos Thread , puede usar el Handler y el Message para comunicarse con el UI Thread


En primer lugar, onCreate() es irrelevante en su caso de uso porque no puede tener una secuencia ejecutándose en segundo plano cuando se inició por primera vez en un código que no es de servicio.

Además, recomendaría usar Google Cloud Messaging en lugar de crear su propio mecanismo. Sería mejor para la duración de la batería del dispositivo y mucho menos código para que lo manejes.

Si desea implementar ese chat completamente por su cuenta, el Service es su única opción. También puede combinarlo con un singleton, pero no recomendaría ese enfoque. Puede usar difusiones y BroadcastReceiver para comunicarse entre su Service y su Activity , creo que es más fácil que un Servicio Bound ya que la vinculación al servicio es asíncrona y crea mucho desorden en comparación con la transmisión simple.