踩坑缘由:

最近项目上用到了即时性的需求,首先就想到了socket,服务端的node.js用的是socket.io,所以我就在github上找到了一个开源的socket.io项目,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!完美解决。特此记录,希望帮助到遇到同样问题的小伙伴们

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐