Android: ¿Cómo usar Gottox / socket.io-java-cliente de la biblioteca con la forma correcta?

Tengo un servicio. Creo un Thread para usar la socket.io-java-client en un hilo separado en este Servicio.

Mantengo el hilo de la siguiente manera:

 @Override public void run() { while (canLiveThread) { // keep thread } } 

Y esta manera totalmente equivocado sí? Para solucionar esta solución necesito encontrar respuesta a las siguientes preguntas:

1. ¿Es necesario crear un thread separado para usar la biblioteca socket.io-java-client en Service? O puedo usar esta biblioteca sin hilo, simplemente implementar la biblioteca socket.io-java-client en Service?

2. Si es necesario crear hilo para utilizar esta biblioteca, entonces cómo administrar el hilo con la forma correcta de no drenar la batería en el servicio de fondo?

Si alguien tiene alguna solución, responda a esta pregunta …

¡Gracias por adelantado!

En realidad, no sé es mi manera de usar socket-io-client derecha, pero trato de estar completamente claro. Como ya sé, socket-io-client ya está utilizando hilos de fondo para conectarse, enviar, recibir eventos.

Primero camino

Creo que no es lo que quieres, pero te muestro esta variante como sea posible. Por lo tanto, en primer lugar, he creado un SocketClient , como este:

 public class SocketClient implements IOCallback { private SocketIO socket; private Context context; // for some cases (ie broadcasting via LocalBroadcastManager). public SocketClient(Context context) { this.context = context; } public synchronized void connect() { if (socket == null || !socket.isConnected()) { Properties properties = new Properties(); // setting your properties... try { socket = new SocketIO("http://your.address", properties); socket.connect(this); } catch (MalformedURLException e) { Log.e("SocketClientException", e.getMessage()); } } } @Override public void onDisconnect() { } @Override public void onConnect() { } @Override public void onMessage(String data, IOAcknowledge ack) { } @Override public void onMessage(JsonElement json, IOAcknowledge ack) { } @Override public void on(String event, IOAcknowledge ack, JsonElement... args) { LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("action_on")); } @Override public void onError(SocketIOException socketIOException) { } } 

Entonces he creado un Singleton que contiene nuestro SocketClient :

 public class API { private static API instance; private SocketClient client; private API() { } public static API getInstance() { if (instance == null) { instance = new API(); } return instance; } public void init(Context context) { client = new SocketClient(context); } public SocketClient getSocketIO() { return client; } } 

Y luego en el método onCreate() clase Service , simplemente llamo a mi singleton:

 @Override public void onCreate() { super.onCreate(); Log.i("SocketService", "onCreate"); API.getInstance().init(getApplicationContext()); API.getSocketIO().connect(); } 

Después de que el socket estará vivo mientras un Service , por lo que será capaz de recibir, enviar comandos de socket en segundo plano a través de nuestro singleton desde cualquier lugar de nuestra aplicación. Podemos enviar los datos recibidos a través de LocalBroadcastManager desde on , onMessage en SocketClient .

Segundo camino

Intentemos implementar un SocketService :

 public class SocketService extends Service implements IOCallback { private SocketIO socket; private synchronized void connect() { if (socket == null || !socket.isConnected()) { Properties properties = new Properties(); // setting your properties... try { socket = new SocketIO("http://your.address", properties); socket.connect(this); } catch (MalformedURLException e) { Log.e("SocketClientException", e.getMessage()); } } } @Override public void onCreate() { super.onCreate(); connect(); } @Override public void onDisconnect() { } @Override public void onConnect() { } @Override public void onMessage(String data, IOAcknowledge ack) { } @Override public void onMessage(JsonElement json, IOAcknowledge ack) { } @Override public void on(String event, IOAcknowledge ack, JsonElement... args) { LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("action_on")); } @Override public void onError(SocketIOException socketIOException) { } } 

Eso es todo. Puede iniciar el servicio desde su actividad y comunicarse a través de transmisiones o mensajes. Nunca he probado la segunda manera, pero creo que debería funcionar como un encanto.

CONCLUSIÓN

Ninguno de estos métodos utiliza hilos de fondo por separado, y funciona para mí, tengo tres aplicaciones basadas en la primera manera, y todos ellos están trabajando en segundo plano sin ningún tipo de apoyo. Espero que la respuesta sea útil para todos los interesantes en el uso de SocketIO 🙂

  • HttpsURLconnection para publicar y obtener en Android
  • Comunicación de socket entre dos aplicaciones en Android
  • Android java.net.SocketException: socket failed: EACCES (Permiso denegado)
  • Android: transmisión de audio a través de sockets TCP
  • Cómo implementar un servidor HTTP en android
  • Reproducir archivos multimedia desde una red telefónica WiFi
  • Android illegalxception
  • Apache HttpClient 4.0 falla en el tiempo de espera para socket en Android
  • Comunicación bidireccional entre android y Server
  • Patrón o mejor práctica para una aplicación cliente de socket simple
  • Android Socket Programación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.