解决androidpn服务器端掉线不会重连的问题
winktj?发布于 3个月前,共有?0?条评论
前面的一个项目里面用到了androidpn来做推送服务,众所周知androidpn这个项目还没成熟,还存在一点小bug。?原文地址已经失效,以下是别人转的?
http://topmanopensource.iteye.com/blog/1609214?
在org.androidpn.client.XmppManager的LoginTask方法中加了一行代码getConnection().startKeepAliveThread(xmppManager);跟踪进去发现是开启了一个线程发送心跳,当发送失败时捕获异常,客户端每隔一段时间进行重连。?如上所说,在我添加?getConnection().startKeepAliveThread(xmppManager);之后的确是报错了,因为Xmppconnection里面没有这个方法,而文中所说的第二个版本我怎么找也没找到。(找到的同学能否发我一份?)catch (SocketException e) {Log.e("PacketReader", e.toString());connection.disconnect();xmppManager.startReconnectionThread();} catch (IOException e) {e.printStackTrace();}?
这样就达到了当与服务端失去连接时,客户端能够进行重新连接的效果。后来群里有朋友说在LoginTask方法中加入?
getConnection().startKeepAliveThread(xmppManager); 编译就报错,那是因为他用的是第一个版本 ,所有请先下载第二个版本,第二个版本带大神精简过smack源码。 其实心跳机制在官方的asmack中就已经存在,并且在建立XmppConnection的时候就已经启动,但是遗憾的是asmack的开发人员并没有进行异常之后的重连?
// Close the stream. try { writer.write("</stream:stream>"); writer.flush(); } catch (Exception e) { // Do nothing } finally { try { writer.close(); } catch (Exception e) { // Do nothing } }解决思路是在LoginTask里面打开一个发送一个心跳包的线程,这个线程用于与检测与服务器的链接状况,当发生异常时,我们自己做重连的处理。
首先,在Xmmpmanager里面添加心跳包线程的内部类