Android Socket.IO保持连接活动的最佳实践

我的Android应用程序使用AndroidAsync库连接到带有Socket.IO客户端的Node.js服务器。 套接字客户端是通过服务建立的。

  • 应用程序打开时,套接字需要保持打开/连接状态
  • 应用程序未打开时,套接字可以关闭
  • 有一个例外,当应用程序未打开时,套接字需要保持打开状态

我目前正在onResume启动Socket.IO服务,并停止应用程序中每个Activity onPause

这似乎效率很低,因为我每次按下主页按钮或切换到应用程序中的其他活动时,基本上都会停止套接字并重新创建一个新套接字。

关于保持套接字打开的上述要求的最佳方法是什么?

 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); } } 

我有部分解决方案(我认为不会解决你的第三个要求)。 我开始编写一个简单的多人游戏,仅仅是为了学习游戏编程。 我决定使用TCP连接(为什么?它的另一个问题……),当用户继续在每个Acitivty(登录 – >大厅 – >选择对手……)时,我必须保持连接打开,我使用了Singleton patthern(双锁检查),包含连接套接字。

伪代码

 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; } }