踩坑缘由:
最近项目上用到了即时性的需求,首先就想到了socket,服务端的node.js用的是socket.io,所以我就在github上找到了一个开源的socket.io项目,socket.io-client-java项目地址https://github.com/socketio/socket.io-client-java,集成使用方式可以上去阅读下代码。
下面说说使用过程中遇到的问题:
Socket mSocket= IO.socket(url);
mSocket.on(Socket.EVENT_CONNECT,connect);
mSocket.connect();
Emitter.Listener connect=new Emitter.Listener() {
public void call(Object... args) {
//连接成功后逻辑
}
};
上面的代码是正常的连接socket的流程,github上的项目demo给出的是在application里初始化socket,由于项目中用到的socket地址有两个,而且是在特定的界面才会使用到socket,所以本着初始化延迟的原则,写在了用到的activity的onResume()方法里,然后诡异的事情就发生了,在跳转到Activity后,socket的的connect的监听事件不起作用,socket.io-client-java的issues列表里面有很多都说在0.6.3后遇到了这个问题。
解决办法:
1. 自己项目中封装一个单例socket连接工具类,像这样:
public static PdfSocketUtil getInstance(){
if(pdfSocketUtil==null) {
pdfSocketUtil=newPdfSocketUtil();
}
return pdfSocketUtil;
}
public PdfSocketUtil() {
}
/**
* 初始化 Socket
*/
public void init() {
if(mSocket!=null&&mSocket.connected())
return;
try{
mSocket= IO.socket(Constants.PDF_SOCKET);
}catch(Exception e) {
e.printStackTrace();
}
}
2. 重点 :
在需要使用socket的时候,调用init() 初始化两次,并不是两次初始化。比如activity A跳转到 activity B,在Activity A跳转方法触发的时候,调用PdfSocketUtil.getInstance().init();在Activity B的onResume() 的方法里面再调用一次PdfSocketUtil.getInstance().init();
OK!完美解决。特此记录,希望帮助到遇到同样问题的小伙伴们