java - Socket.io 连接不适用于多个 fragment

标签 java android socket.io

我正在使用 socket.io 创建一个项目。只要只有一个 fragment ,它就可以很好地工作。然而,当我在主要 Activity 中添加更多 fragment 时,它开始创建多个连接,我认为这不是一个好主意。

起初我直接从 fragment 连接到 socket.io,但那是为每个 fragment 创建一个连接。所以我在 Application 类中创建了一个连接并在 fragment 中使用它,这立即解决了多连接问题。但是现在出现了新的问题。

在互联网断开和重新连接的情况下, fragment 不会从 Application 类重新建立连接。我已经尝试了一个多星期但没有解决方案。奇怪的是,我在互联网和 stackoverflow 上进行了搜索,但从未有人问过这样的问题。

这是Application类中的连接代码

synchronized public Socket getSocket() {
    if (mSocket == null) {
        try {
            IO.Options opts = new IO.Options();
            opts.reconnection = true;
            opts.reconnectionDelay = 1000;
            mSocket = IO.socket("http://ddbharti.in", opts);

            mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.d(TAG, "EVENT_CONNECT");
                }

            }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.d(TAG, "EVENT_DISCONNECT");
                }
            }).on(Socket.EVENT_ERROR, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.d(TAG, "error");
                }
            });
            mSocket.connect();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    return mSocket;
}

这就是每个 fragment 的连接方式

socket = application.getSocket();
socket.emit("tag", tag);

如果互联网工作正常,此设置将完美运行,加载时间为 300 毫秒。但是,当我断开/重新连接互联网或者我保持互联网断开连接并启动应用程序然后连接到互联网时。 Application 类中的连接可以快速连接,但由于某些原因,当前 fragment 中的连接无法获取。

如果我切换 fragment ,它会再次开始监听来自 Application 类的连接。

所以我在这里遗漏了什么吗?如果重新连接而不重新加载整个 fragment ,我如何强制 fragment 再次从应用程序类获取连接?

非常感谢任何帮助。

最佳答案

所以我创建了一个事件监听器来监听套接字连接状态并相应地显示 ui。只需与事件监听器建立连接即可。

关于java - Socket.io 连接不适用于多个 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57916964/

相关文章:

Java限制资源使用

java - 如何使用 Redis 适配器写入 Geode,然后使用 Geode 客户端读取/响应事件?

android - 如何在 Android 的内部缓存目录中创建图像文件

javascript - socket.io如何为每个新连接发出热点事件

laravel - Redis 未在 Laravel 5.1 中接收广播事件

java - 从 lambda 表达式中更新 AtomicBoolean

java - 如何在spring jdbctemplate中从多个表中选择多行

java - TextWatcher.onTextChanged() 如何处理预测文本?

java - 使用 Facebook SDK 和 ParseFacebookUtils 登录时出现 NullPointerException

javascript - socket.io 客户端是否必须存在于全局范围内?