【问题标题】:The program executes a line of code multiple times程序多次执行一行代码
【发布时间】:2019-09-30 13:14:30
【问题描述】:

我尝试用“socket.io”写一个信使。 并写下这个。

//Socket.
private Socket socket;
{
    try {
        socket = IO.socket("http://192.168.1.3:8001");
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
}

//Tools.
Handler handlerServerMakeMeOnline;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.a_room_list);

    handlerServerMakeMeOnline = new Handler();
    socket.connect();
    socket.on("serverMakeMeOnline", serverMakeMeOnlineListener);
}



private Emitter.Listener serverMakeMeOnlineListener = new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        handlerServerMakeMeOnline.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(RoomListA.this, "Online", Toast.LENGTH_SHORT).show();
            }
        });
    }
};

@Override
protected void onDestroy() {
    socket.emit("makeMeOffline", userCode);
    socket.disconnect();
    socket.close();
    super.onDestroy();
}

但是我有一个奇怪的问题。 当我第一次打开程序时,一切正常。 但是当我关闭应用程序并再次打开它时,serverMakeMeOnlineListener 内的Toast 被调用两次,如果我再次关闭并打开应用程序Toast 被调用三次等

【问题讨论】:

  • 尝试在 onDestroy 期间添加这个:socket.off("makeMeOffline", handlerServerMakeMeOnline);在socket.disconnect()之后;
  • 还在 onDestroy() 中添加 serverMakeMeOnlineListener =null
  • 您是否尝试调试代码?我的意思是实际调试,如果需要检查内存地址等等......这是一个非常简单的问题。

标签: android socket.io


【解决方案1】:

我认为问题正在发生,因为您没有在 onDestroy 期间删除 Emitter.Listener 这样,每次打开应用时,您都会添加一个新的Emitter.Listener,从而导致Toast 显示不止一次。

那么,试试这个:

@Override
protected void onDestroy() {
    socket.disconnect();
    socket.off("makeMeOffline", handlerServerMakeMeOnline);
    socket.close();
    super.onDestroy();
}

让我知道这是否有效。如果没有,我将删除此答案

【讨论】:

    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多