Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连
学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接
首先要创建连接监听器,用来监听连接状态,这里我写了一个类
继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionClosedOnError()
前者为连接正常断开,后者是连接异常断开,不管是正常还是异常,我们都要监听到
这里写了一个定时器,两秒进行连接一次,注释写的也很清楚,不做太多介绍
要注意的是我把用户名和密码都存到sharePreferences中了
package com.techrare.listener; import java.util.Timer;
import java.util.TimerTask; import org.jivesoftware.smack.ConnectionListener; import android.util.Log; import com.techrare.taxicall.MainActivity;
import com.techrare.utils.Utils;
import com.techrare.utils.XmppConnection; /**
* 连接监听类
*
* @author Administrator
*
*/
public class TaxiConnectionListener implements ConnectionListener {
private Timer tExit;
private String username;
private String password;
private int logintime = 2000; @Override
public void connectionClosed() {
Log.i("TaxiConnectionListener", "連接關閉");
// 關閉連接
XmppConnection.getInstance().closeConnection();
// 重连服务器
tExit = new Timer();
tExit.schedule(new timetask(), logintime);
} @Override
public void connectionClosedOnError(Exception e) {
Log.i("TaxiConnectionListener", "連接關閉異常");
// 判斷為帳號已被登錄
boolean error = e.getMessage().equals("stream:error (conflict)");
if (!error) {
// 關閉連接
XmppConnection.getInstance().closeConnection();
// 重连服务器
tExit = new Timer();
tExit.schedule(new timetask(), logintime);
}
} class timetask extends TimerTask {
@Override
public void run() {
username = Utils.getInstance().getSharedPreferences("taxicall",
"account", MainActivity.context);
password = Utils.getInstance().getSharedPreferences("taxicall",
"password", MainActivity.context);
if (username != null && password != null) {
Log.i("TaxiConnectionListener", "嘗試登錄");
// 连接服务器
if (XmppConnection.getInstance().login(username, password)) {
Log.i("TaxiConnectionListener", "登錄成功");
} else {
Log.i("TaxiConnectionListener", "重新登錄");
tExit.schedule(new timetask(), logintime);
}
}
}
} @Override
public void reconnectingIn(int arg0) {
} @Override
public void reconnectionFailed(Exception arg0) {
} @Override
public void reconnectionSuccessful() {
} }
其次就是给连接设置监听器了,最好放在登录方法里,关闭连接方法里移除监听
// 添加連接監聽
TaxiConnectionListener connectionListener = new TaxiConnectionListener();
getConnection().addConnectionListener(connectionListener);
connection.removeConnectionListener(connectionListener);
先介绍到这里~
Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连的更多相关文章
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...
- Android基于XMPP Smack Openfire下学习开发IM(六)总结
不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java package com.techrare.utils; import ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
- Android基于XMPP Smack及Openfire学习笔记(1)
之前开发的项目中实用到IM聊天功能.可是这块功能公司有专门的IM团队来开发,由他们开发好后.直接接入到我们APP中.我參与写IM相关功能非常地少,所以也一直想学习相关知识 . 眼下Android主要用 ...
- openfire Android学习(五)------连接断开重连
首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...
- Android基于XMPP的即时通讯2-文件传输
本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输 1.初始化文件传输管理类 public static FileTransferManager get ...
- Android基于XMPP的即时通讯3-表情发送
这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...
- 基于XMPP的即时通信系统的建立(五)— openfire
现决定使用Openfire作为服务端,Openfire采用Java开发,基于XMPP的实时开源协作服务器.单台可支持上万并发用户. Openfire体系结构 Openfire体系由其提供的服务器端.客 ...
- Android基于xmpp的即时通讯应用
xmpp是一个通信协议.因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议.Android上最常用的组合asmack +openfire.Asmack是smack的android版, ...
随机推荐
- skip-grant-tables:非常有用的mysql启动参数
skip-grant-tables:非常有用的mysql启动参数 介绍一个非常有用的mysql启动参数—— --skip-grant-tables.顾名思义,就是在启动mysql时不启动grant ...
- mapreduce 多路输出
Streaming支持多路输出(SuffixMultipleTextOutputFormat) 如下示例: hadoop streaming \ -input /home/mr/data/test_t ...
- java 使用正则表达式从网页上提取网站标题
如何从网页上抓取有价值的东西?看懂了下面的程序(非常简单),想从网页上抓取什么信息(标题.内容.Email.价格等)就能抓取什么信息. package catchhtml; import java.i ...
- vnc执行,报xauth could not run
/usr/bin/gnome-terminal [INFO-10%]生成随机密码 [INFO-20%]生成密码文件 [INFO-30%]完成初始化,准备打开连接 Error: could not ru ...
- Oracle系列之游标
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 游标: 1.目的 解决“ select * ”返回空.多行记录问题 但凡select,就可能多行结果集,也就需要用游标 2.原理 多行 ...
- eclipse 批量 查询 替换
对于 要对多个jsp 或 java文件中的 某个字符串 方法 参数 之类的进行统一更改,一直很头疼,直到昨天用了 urlrewriter 的 xml 配置文件 才恍然大悟,可以用 regular ex ...
- ORA-28001: the password has expired
大早上正式库提示: Oracle提示错误消息ORA-28001: the password has expired 解决办法: 1.利用SYSDBA权限登陆: 2.查看账户信息:select user ...
- Webform——验证控件
验证控件一般是在注册的时候用到,是直接将JS代码封装到了控件里面,拉过来直接可以用,下面介绍一下主要用法: 1.CompareValidator:比较验证 常用属性:ControlToCompare ...
- Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类
话接上篇.成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类.直接看代码吧. #include "include/lua.hpp" #include ...
- c语言main函数的参数argc,argv说明
main函数参数argc,argv说明 C/C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(i ...