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

继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionClosedOnError()

前者为连接正常断开,后者是连接异常断开,不管是正常还是异常,我们都要监听到

这里写了一个定时器,两秒进行连接一次,注释写的也很清楚,不做太多介绍

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

[java] view
plain
copy

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

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

[java] view
plain
copy

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

  1. connection.removeConnectionListener(connectionListener);

最新文章

  1. SQLServer语句执行效率及性能测试
  2. poj 1691 图方块 end
  3. linux连接与传输等命令
  4. 在pc游览器端模拟移动端幻灯片
  5. 将linux用在开发环境中
  6. CentOS下搭建使用gitlab 和tortoiseGit使用
  7. 通知(NSNotificationCenter)
  8. [wikioi]过河卒
  9. hdu1869六度分离(dijkstra)
  10. jjs 产生undefined的情况
  11. 《认知与设计:理解UI设计准则》【PDF】下载
  12. Mysql的硬件优化和配置优化
  13. DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究
  14. html2canvas在Vue项目踩坑-生成图片偏移不完整
  15. Scrapy库的安装(windows版)
  16. 关于EF实体类的一点思考
  17. POJ2431--Expedition(优先队列)
  18. Logstash 报错 An unexpected error occurred! :error => bad URI(is not URI?,是因为路径c:\program files\logstash\logstash.bat 中有空格
  19. websocket使用
  20. Java并发编程--6.Exchanger线程间交换数据

热门文章

  1. SVN 删除所有目录下的“.svn”文件夹,让文件夹脱离SVN控制
  2. xcode8.1 autolayout 找不到 Update Frames 按钮
  3. 一步一步解剖Libevent源代码 - 0
  4. SDOJ 3740 Graph
  5. 【java基础 17】集合中各实现类的性能分析
  6. Graham扫描法 --求凸包
  7. 刷题总结——ball(ssoj)
  8. 第一个 XMLHttpRequest 例子(API)
  9. CentOS7 修改时区、charset
  10. hdu 3264 圆的交+二分