gpt4 book ai didi

保持连接有效的 Android Socket.IO 最佳实践

转载 作者:可可西里 更新时间:2023-11-01 19:08:27 25 4
gpt4 key购买 nike

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

  • 当应用程序打开时,Socket 需要保持打开/连接状态
  • Socket 可以在应用未打开时关闭
  • 有一个异常(exception),当应用程序未打开时套接字需要保持打开状态

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

这看起来效率很低,因为每次按下主页按钮或切换到应用程序中的另一个 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);
}

}

最佳答案

调查旧的悬而未决的问题,发现了这个问题。我认为最好的方法是使用自动启动的绑定(bind)服务。

使用 bindService(),您可以在 onResume() 或 onStart() 中绑定(bind)您的 Activity,并让您的服务关闭连接并在没有客户端绑定(bind)时自行停止。

您可以在此处找到更多信息 https://developer.android.com/guide/components/bound-services

关于保持连接有效的 Android Socket.IO 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23231751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com