WebSocketClient objects are not reuseable

好久没写东西,夜深了来冒个泡,先啰嗦几句。今天测试 Android App 的时候,发现推到后台不到一分钟再唤醒直接闪退,初次以为网络和GPS信号弱导致的(当时是在地铁上进行的测试),之后在网络与GPS 信号较稳定的时候也闪退。。。于是出于好奇,帮助同事解决一下,打开AS进行连调,结果连调情况下不会闪退。最后还是查日志锁定到了问题所在。

复制代码
//TODO 连接websocket
new Thread() {
    @Override
    public void run() {
        try {
            //connectBlocking多出一个等待操作,会先连接再发送,否则未连接发送会报错
            client.connectBlocking();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}.start();

执行client.connectBlocking(); 会报错WebSocketClient objects are not reuseable。

看他代码,并没有用到websocket的状态进行判断。

我们先来看下websocket的四种状态

复制代码
public enum ReadyState {
    NOT_YET_CONNECTED, OPEN, CLOSING, CLOSED
}

在重连的时候,没有排除之前没有连接上这种状态,导致崩溃。

**重点在这里:**经过以下调整,就不会再崩溃了。

复制代码
//TODO 连接websocket
if (client != null && !client.isOpen()) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            if (client.getReadyState().equals(ReadyState.NOT_YET_CONNECTED)){
                try {
                    client.connectBlocking();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else if (client.getReadyState().equals(ReadyState.CLOSING) || client.getReadyState().equals(ReadyState.CLOSED)){
                try {
                    client.reconnectBlocking();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }).start();
}

还要注意的一个问题就是防止创建多条连接 ,注意创建逻辑哦~

good luck

相关推荐
User_芊芊君子27 分钟前
【JavaSE】复习总结
java·开发语言·python
我有一颗五叶草37 分钟前
线程间通信
java·开发语言
我真的是大笨蛋5 小时前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
碳水加碳水5 小时前
Java代码审计实战:XML外部实体注入(XXE)深度解析
java·安全·web安全·代码审计
努力也学不会java6 小时前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿6 小时前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
学亮编程手记7 小时前
K8S v1.33 版本主要新特性介绍
java·容器·kubernetes
Haven-8 小时前
Java-面试八股文-JVM篇
java·jvm·面试
我真的是大笨蛋8 小时前
JVM调优总结
java·jvm·数据库·redis·缓存·性能优化·系统架构
wjs0408 小时前
Git常用的命令
java·git·gitlab