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:
- ¿Tiene sentido tener más de un socket UDP Datagram en espera? ¿Los paquetes "simultáneos" han sido eliminados o puestos en cola por el núcleo?
- Envío de flujo de imágenes por problema de socket: Android
- Java Client Socket Connection en Android
- AsyncSocket en java?
- Problema con la conexión Bluetooth de Android
@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!
- Recuperar mediante programación los datos de uso de la red de etiquetas en Android
- ¿Cómo se puede forzar una descarga en un objeto OutputStream sin cerrarlo?
- Uso incorrecto de BufferedReader
- Autenticación SSL de dos vías en android
- Recibir mensaje de difusión en Android
- Desarrollo de aplicaciones de chat de Android
- Intercambio de datos entre dos dispositivos Android en hotspot
- ¿Cómo mostrar la imagen JPEG directamente desde la matriz de bytes (antes de guardar la imagen)?
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
🙂
- Cómo descargar la imagen utilizando volley y almacenar en caché mientras la imagen no está en uso
- ¿Cómo guardar una respuesta en un juego de enigmas sin crear una base de datos?