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

相关推荐
黄雪超16 分钟前
JVM——打开JVM后门的钥匙:反射机制
java·开发语言·jvm
有梦想的攻城狮24 分钟前
spring中的@RabbitListener注解详解
java·后端·spring·rabbitlistener
李斯维26 分钟前
循序渐进 Android Binder(二):传递自定义对象和 AIDL 回调
android·java·android studio
androidwork28 分钟前
OkHttp 3.0源码解析:从设计理念到核心实现
android·java·okhttp·kotlin
程序员岳焱30 分钟前
Java 程序员成长记(二):菜鸟入职之 MyBatis XML「陷阱」
java·后端·程序员
我命由我1234531 分钟前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
面朝大海,春不暖,花不开31 分钟前
Spring Boot消息系统开发指南
java·spring boot·后端
程序员岳焱33 分钟前
Java 程序员成长记(三):菜鸟入职之@Transactional「罢工」
java·后端·编程语言
Rocky40141 分钟前
JAVAEE->多线程:锁策略
java·开发语言·jvm
白宇横流学长41 分钟前
基于J2EE架构的在线考试系统设计与实现【源码+文档】
java·架构·java-ee