The*_*mad 14 sockets service android socket.io
我的Android应用程序正在使用该AndroidAsync库连接到客户端的Node.js服务器Socket.IO.套接字客户端是通过服务建立的.
我目前正在启动Socket.IO服务onResume并在应用程序中停止onPause每个服务Activity.
这看起来效率很低,因为我每次按下主页按钮或切换到应用程序中的其他活动时,基本上都会停止套接字并重新创建一个新套接字.
什么是处理保持套接字打开的上述要求的最佳方法?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我有部分解决方案(我认为不会解决你的第三个要求)。我开始编写一个简单的多人游戏只是为了学习游戏编程。我决定使用 TCP 连接(为什么?这是另一个问题...),当用户在每个 Acitivty 中进行操作时(登录 -> 大厅 -> 选择对手...),我必须保持连接打开,我使用了 Singleton模式(双锁检查),包含连接插座。
伪代码
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4498 次 |
| 最近记录: |