openfire Android學習(五)------連接斷開重連

首先要創建連接監聽器,用來監聽連接狀態,這裏我寫了一個類

繼承了ConnectionListener,重寫了裏面5個方法,最重要的兩個方法connectionClosed()和connectionClosedOnError()

前者爲連接正常斷開,後者是連接異常斷開,不管是正常還是異常,我們都要監聽到

這裏寫了一個定時器,兩秒進行連接一次,註釋寫的也很清楚,不做太多介紹

要注意的是我把用戶名和密碼都存到sharePreferences中了

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.techrare.listener;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import org.jivesoftware.smack.ConnectionListener;  
  7.   
  8. import android.util.Log;  
  9.   
  10. import com.techrare.taxicall.MainActivity;  
  11. import com.techrare.utils.Utils;  
  12. import com.techrare.utils.XmppConnection;  
  13.   
  14. /** 
  15.  * 連接監聽類 
  16.  *  
  17.  * @author Administrator 
  18.  *  
  19.  */  
  20. public class TaxiConnectionListener implements ConnectionListener {  
  21.     private Timer tExit;  
  22.     private String username;  
  23.     private String password;  
  24.     private int logintime = 2000;  
  25.   
  26.     @Override  
  27.     public void connectionClosed() {  
  28.         Log.i("TaxiConnectionListener""連接關閉");  
  29.         // 關閉連接  
  30.         XmppConnection.getInstance().closeConnection();  
  31.         // 重連服務器  
  32.         tExit = new Timer();  
  33.         tExit.schedule(new timetask(), logintime);  
  34.     }  
  35.   
  36.     @Override  
  37.     public void connectionClosedOnError(Exception e) {  
  38.         Log.i("TaxiConnectionListener""連接關閉異常");  
  39.         // 判斷為帳號已被登錄  
  40.         boolean error = e.getMessage().equals("stream:error (conflict)");  
  41.         if (!error) {  
  42.             // 關閉連接  
  43.             XmppConnection.getInstance().closeConnection();  
  44.             // 重連服務器  
  45.             tExit = new Timer();  
  46.             tExit.schedule(new timetask(), logintime);  
  47.         }  
  48.     }  
  49.   
  50.     class timetask extends TimerTask {  
  51.         @Override  
  52.         public void run() {  
  53.             username = Utils.getInstance().getSharedPreferences("taxicall",  
  54.                     "account", MainActivity.context);  
  55.             password = Utils.getInstance().getSharedPreferences("taxicall",  
  56.                     "password", MainActivity.context);  
  57.             if (username != null && password != null) {  
  58.                 Log.i("TaxiConnectionListener""嘗試登錄");  
  59.                 // 連接服務器  
  60.                 if (XmppConnection.getInstance().login(username, password)) {  
  61.                     Log.i("TaxiConnectionListener""登錄成功");  
  62.                 } else {  
  63.                     Log.i("TaxiConnectionListener""重新登錄");  
  64.                     tExit.schedule(new timetask(), logintime);  
  65.                 }  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     @Override  
  71.     public void reconnectingIn(int arg0) {  
  72.     }  
  73.   
  74.     @Override  
  75.     public void reconnectionFailed(Exception arg0) {  
  76.     }  
  77.   
  78.     @Override  
  79.     public void reconnectionSuccessful() {  
  80.     }  
  81.   
  82. }  

其次就是給連接設置監聽器了,最好放在登錄方法裏,關閉連接方法裏移除監聽

[java] view plaincopy
  1. // 添加連接監聽  
  2. TaxiConnectionListener connectionListener = new TaxiConnectionListener();  
  3. getConnection().addConnectionListener(connectionListener);  
[java] view plaincopy
  1. connection.removeConnectionListener(connectionListener);  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章