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:
- No se puede leer socket InputStream en Jelly Bean
- Uso incorrecto de BufferedReader
- Cómo implementar un servidor HTTP en android
- Socket no lanza una excepción aunque no puede conectarse
- cómo leer el flujo de entrada de socket en 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!
- Comunicación bidireccional entre android y Server
- Apache HttpClient 4.0 falla en el tiempo de espera para socket en Android
- Tecnología para aplicaciones como teamviewer en android
- Recuperar mediante programación los datos de uso de la red de etiquetas en Android
- Desarrollo de aplicaciones de chat de Android
- Patrón o mejor práctica para una aplicación cliente de socket simple
- Android - Sockets vs Polling
- AsyncSocket en java?
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?