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