Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连

来源:互联网 发布:类似wiboxls的软件 编辑:程序博客网 时间:2024/05/16 14:34

http://blog.csdn.net/jie1991liu/article/details/24371729


首先要创建连接监听器,用来监听连接状态,这里我写了一个类

继承了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;@Overridepublic void connectionClosed() {Log.i("TaxiConnectionListener", "連接關閉");// 關閉連接XmppConnection.getInstance().closeConnection();// 重连服务器tExit = new Timer();tExit.schedule(new timetask(), logintime);}@Overridepublic 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 {@Overridepublic 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);}}}}@Overridepublic void reconnectingIn(int arg0) {}@Overridepublic void reconnectionFailed(Exception arg0) {}@Overridepublic void reconnectionSuccessful() {}}

其次就是给连接设置监听器了,最好放在登录方法里,关闭连接方法里移除监听

[java] view plaincopy
  1. // 添加連接監聽  
  2. TaxiConnectionListener connectionListener = new TaxiConnectionListener();  
  3. getConnection().addConnectionListener(connectionListener);  
[java] view plaincopy
  1. connection.removeConnectionListener(connectionListener);  
0 0