第一步 配置
config.setReconnectionAllowed(true);
第二部 添加监听事件
connection.connect();
if (connection.isConnected()) {
connectionListener = new ViConnectionListener();
connection.addConnectionListener(connectionListener);
}
事件代码:
public class ViConnectionListener implements ConnectionListener {
@Override
public void connectionClosed() {
Log("connectionClosed--->");
}
@Override
public void connectionClosedOnError(Exception e) {
Log("connectionClosedOnError--->" );
// 这里就是网络不正常或者被挤掉断线激发的事件
if (e.getMessage().contains("conflict")) { // 被挤掉线
Toast("被挤下线");
/*
* log.e("来自连接监听,conn非正常关闭"); log.e("非正常关闭异常:"+arg0.getMessage());
* log.e(con.isConnected());
*/
// 关闭连接,由于是被人挤下线,可能是用户自己,所以关闭连接,让用户重新登录是一个比较好的选择
XmppTool.getInstance().closeConnection();
// 接下来你可以通过发送一个广播,提示用户被挤下线,重连很简单,就是重新登录
} else if (e.getMessage().contains("Connection timed out")) {// 连接超时
// 不做任何操作,会实现自动重连
Log( "连接超时");
}
}
@Override
public void reconnectingIn(int arg0) {
Log("reconnectingIn--->");
}
@Override
public void reconnectionFailed(Exception arg0) {
Log("reconnectionFailed--->" + arg0.getMessage());
arg0.printStackTrace();
}
@Override
public void reconnectionSuccessful() {
Log("reconnectionSuccessful--->");
}
private void Log(String msg){
Log.e("---->",msg);
}
}
第三步、最重要的一步
需在代码前静态加载ReconnectionManager,重连才能正常工作: (之前都忘了加这个 导致无法自动重连)
static{
try{
Class.forName("org.jivesoftware.smack.ReconnectionManager");
}catch(Exception e){
e.printStackTrace();
}
}