asmack断线重连实现

在以前的asmack版本中,断线重连是需要我们自己做的,原理很简单,分两种情况,一种是断网了,另外一种就是掉线了。

1.没有网络的情况下。

没有网络的情况下,如果想要在所有页面提示用户开启网络,一个一个页面写会很麻烦,其实我们可以写一个baseActivity,在这个里面做断网相关操作,其他的activity集成了这个类,那么就能在整个应用程序中弹出对话框,要想实现全局的对话框,使用这种方法挺好的。

无网络的监听主要是监听安卓系统的一个广播,叫做android.net.conn.CONNECTIVITY_CHANGE;具体逻辑如下:

*----1)在baseActivity监听系统网络改变广播:android.net.conn.CONNECTIVITY_CHANGE;  

*----2)收到断网广播以后,显示无网络(Contactfragment),并提示用户打开网络(BaseActivity)。

*----3)收到网络恢复广播以后,去掉无网提示(ContactFragment)。

*

扫描二维码关注公众号,回复: 367829 查看本文章

*2.有网络但是没有xmpp连接的情况下。

我们有两种处理方法,第一种就是自己写一个断线重连机制,配合闹钟使用,因为现在asmack提供了自己的断线重连,所以主要讲第二种,第二种是在初始化xmppConnection的时候,设置reconnection为true;

如下:

ConnectionConfiguration connConfig = new ConnectionConfiguration(
				kimHost, PubConstant.XMPP_PORT);
		connConfig.setReconnectionAllowed(true);

 asmack的这套机制做了很多相关的处理,比如网络恢复后继续连接服务器,这样生了很多烦恼;

*----1)登录的时候注册IMConnectionListener,当网络发生改变,调用了connectionClosed或者connectionClosedOnError的时候,如果不是登陆冲突,则发送重连广播。

*----2)当调用了reconnectionFailed的时候,首先检测是不是没网络,是的话直接返回。

*----3)网络恢复,发送网络恢复广播通知ContactFragment去掉连接异常提示。

最新的asmack的jar已经帮我们实现了断线重连,内部就有一套机制对断线做了相关的处理。使用起来很简单,但是这个有一个不好的地方就是,当重连上了以后,可能只能发出消息,不能收到消息。因此,我们需要在重连成功之后,在添加一下Listener。

添加listener包括单聊和群聊的都要添加(如果有群聊功能的话),否则会导致收不到消息或者发送不出去消息;其实我做完之后发现,这个和重新登录一遍没啥两样了,但是至少效果是有了的。

本文系原创,还请装载的朋友注明原处,尊重作者劳动成果;

猜你喜欢

转载自zhonglunshun.iteye.com/blog/2250319