好久没写东西,夜深了来冒个泡,先啰嗦几句。今天测试 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