Mejores prácticas de Android Socket.IO para mantener la conexión activa
Mi aplicación para Android
utiliza la biblioteca AndroidAsync
para conectarse a un servidor Node.js
con el cliente Socket.IO
. El cliente socket se establece a través de un servicio.
- El socket necesita permanecer abierto / conectado cuando la aplicación está abierta
- El socket se puede cerrar cuando la aplicación no está abierta
- Hay una excepción en la que socket necesita permanecer abierta mientras la aplicación no está abierta
Actualmente estoy iniciando el servicio Socket.IO en el onResume
y me onPause
en onPause
de cada Activity
en la aplicación.
- Los websockets de AndroidAsync no funcionan
- Gestionar devoluciones de llamada en el cliente android de Socket.io v1.4
- Comunicarse con socket.io desde android
- ¿Cómo puedo enviar params a Controller usando socket en Sails JS de Android
- Cómo manejar eventos de socket como servicio de fondo en Android?
Esto parece realmente ineficaz porque básicamente detengo el socket y recreo uno nuevo cada vez que presiono el botón de inicio, o cambiar a otra actividad en la aplicación.
¿Cuál sería la mejor manera de manejar los requisitos anteriores sobre cómo mantener abierto el zócalo?
public class SocketIOService extends Service { private Preferences prefs; private SocketIOClient socket; @Override public int onStartCommand(Intent intent, int flags, int startId) { try { ConnectCallback callback = new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, SocketIOClient client) { if (ex != null) { ex.printStackTrace(); return; } Log.v("SOCKET IO CONNECTION", "ESTABLISHED"); client.setDisconnectCallback(new DisconnectCallback() { @Override public void onDisconnect(Exception e) { Log.v("SOCKET IO CONNECTION", "TERMINATED"); } }); client.setErrorCallback(new ErrorCallback() { @Override public void onError(String error) { Log.e("SOCKET IO ERROR", error); } }); client.setExceptionCallback(new ExceptionCallback() { @Override public void onException(Exception e) { e.printStackTrace(); } }); client.setReconnectCallback(new ReconnectCallback() { @Override public void onReconnect() { Log.v("SOCKET IO CONNECTION", "RECONNECTED"); } }); client.on(EVENT_NEWS, new EventCallback() { @Override public void onEvent(JSONArray argument, Acknowledge acknowledge) { Log.v("EVENT:NEWS", argument.toString()); } }); client.on(EVENT_MESSAGE_RECEIVE, new EventCallback() { @Override public void onEvent(JSONArray argument, Acknowledge acknowledge) { handleMessageReceive(argument); } }); } }; socket = SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), URL_SERVER, callback).get(); JSONArray array = new JSONArray(); JSONObject obj = new JSONObject(); prefs = new Preferences(this); try { obj.put(KEY_USER_ID, prefs.getUserId()); } catch (JSONException e) { e.printStackTrace(); } array.put(obj); socket.emit(EVENT_LOG_USER_ID, array); Log.v("SOCKET LOG USER ID", array.toString()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } // If we get killed, after returning from here, restart return START_REDELIVER_INTENT; } @Override public void onDestroy() { Log.v("SOCKET IO SERVICE", "STOPPED"); if (socket != null) { if (socket.isConnected()) { socket.disconnect(); } } } @Override public IBinder onBind(Intent intent) { return null; } private void handleMessageReceive(JSONArray json) { ChatMessage message = JReader.createMessage(json); } }
- ¿Es posible usar WebSockets o similar con una aplicación nativa de Android?
- Socket.io - ReferenceError: io no está definido
- Aplicación de Android Conexión al servidor Node.js mediante Socket.io
- WebSockets para Android en la aplicación Phonegap con Node.js / Socket.IO server & client
- Android Nkzawa SocketIO desconectar y hacer una nueva conexión
- ¿Cómo enviar datos binarios con socket.io?
- DataChannel.state () devuelve siempre CONNECTING webRTC Android
- AndroidAsync Socket.io ArrayIndexOutOfBoundsException
Tengo una solución parcial (no va a resolver su tercer requisito, creo). Comencé a escribir un juego multi-jugador simple apenas para studing la programación del juego. Decidí utilizar TCP conntection (por qué? Es otro problema …), y tuve que mantener la conexión abierta mientras el usuario procedía en cada Acitivty (login -> lobby -> elegir el oponente …), he usado un Singleton (Comprobación de doble bloqueo), que contiene el enchufe de conexión.
Pseudo código
class ClientConnection{ private static ClientConnection conn = null; Socket mSocket; // your socket protected ClientConnection(){ mSocket = new Socket(); // mSocket.connect( bla bla bla ) } public Socket getSocket(){ return mSocket(); } public static ClientConnection getInstance(){ if(conn == null){ synchronized (LOCK) { if(conn == null){ conn = new ClientConnection(); } } } return conn; } }
- En el Google Chrome de Android, cómo establecer unsafely-treat-insecure-origin-as-secure
- Cómo arrastrar el elemento de lista desplegable a otro ListView