Android Nkzawa SocketIO 断开连接并建立新连接

5

我正在使用Android、socketio (nkzawa)进行工作。第一次连接时完美运行。但是,如果我断开连接并尝试进行“另一个连接”,则EVENT_CONNECT永远不会被调用。

这里我放了一些片段

当我连接时

在BeforeActivity中

@Override
public void onResume() {
    super.onResume();   
    socketManager = (socketManager) socketManager.Instance(this, UrlHelper.URL.replaceAll("\\{userId\\}", userId.toString());
}

然后我有一个继承自GenericSocket的SocketManager类,其中我有一个变量(SocketManager实例)用于单例。

public static SocketManager Instance(SocketListener listener, String url) {

  if (instance == null) {
    instance = new socketManager(url);
    instance.init();
  }

  socketManager.listener = (listener)listener;

  return instance;
}

在类GenericSocket中初始化套接字,我有一个类型为(com.github.nkzawa.socketio.client.Socket)的变量socket。

protected void init() {
    try {
        socket = IO.socket(url);
        socket
        .on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                onConnect();
                JSONObject connectionMessage = getConnectionMessage();
                socket.emit(MESSAGE_JOIN, connectionMessage);
            }

        }).on(MESSAGE, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                Object data = args[0];
                if (data instanceof JSONObject) {
                    JSONObject json = (JSONObject) data;
                    try {
                        onMessage(json.get("content").toString());
                    } catch (Exception ex) {
                        Log.e(TAG, ex.getMessage());
                    }
                } else {
                    onMessage(data.toString());
                }

            }
        }).on(Constant.CONNECTION, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                Object data = args[0];
                if (data instanceof JSONObject) {
                    JSONObject json = (JSONObject) data;
                    try {
                        onMessage(json.get("content").toString());
                    }
                    catch(Exception ex) {
                        Log.e(TAG, ex.getMessage());
                    }
                } else {
                    onMessage(data.toString());
                }

            }
        }).on(com.github.nkzawa.socketio.client.Socket.EVENT_DISCONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                onDisconnect();
            }
        });
        socket.connect();
    }catch (Exception e){
        Log.i("Socket connection error: ", e.getMessage());
    }
    //end socket connection
}

当我断开连接时

在SocketManager类内部,有一个名为此的方法

public void disconnect() {
  this.socket.disconnect();
  this.socket=null;
  SocketManager.instance = null;
}

谢谢你


@jimmy0251,我已经更新了,希望现在更加清晰明了。谢谢。 - agusgambina
1
你的代码看起来没问题。尝试在socket.disconnect()之前加上this.socket.off()。我曾经遇到过这样的问题,即使断开连接后服务器仍保持我的连接处于活动状态,但socket.off()对我起了作用。 - jimmy0251
1
你是在Activity的onPause()回调中调用disconnect方法,对吗? - jimmy0251
@jimmy0251谢谢你的回答,现在我将尝试使用socket.off()。但我不是在onpause上调用,而是手动调用,因为我的应用程序上的事件会触发它。 - agusgambina
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - agusgambina
显示剩余2条评论
1个回答

5

你的代码看起来没问题。试着在socket.disconnect()之前加上this.socket.off()。我曾经遇到过这样一个问题,即使在断开连接后服务器仍然保持我的连接,但socket.off()对我有效。


1
谢谢你的回答,正如我告诉你的那样,我需要做到这一点,同时将 nkzawa socket 版本从 0.2.1 更新到 0.4.0。谢谢。 - agusgambina
我知道有点晚了,但这可能会对某些人有所帮助 -> 我通过结合这个答案和更新lib到1.0.0来解决了它。干杯! - Vucko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接