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

继承了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);

openfire Android学习(五)------连接断开重连的更多相关文章

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

    学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接 首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面 ...

  2. zookeeper 大量连接断开重连原因排查

    转自:http://blog.csdn.net/hengyunabc/article/details/41450003?utm_source=tuicool&utm_medium=referr ...

  3. openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等

    openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室. 虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下 ...

  4. openfire Android学习(一)----实现用户注册、登录、修改密码和注销等

    以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...

  5. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  6. android学习五---OpenCV for android环境搭建

    学习android的目的是想在手机上实现计算机视觉的算法.一般算法的研究都是在Matlab上进行,但是手机平台没有那么多的计算资源,用matlab显然是不太现实的.而OpenCV是基于C++语言编写的 ...

  7. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  8. Android学习五:Content Provider 使用

    1ContentProvider相关知识1.1在安卓应用中,通过文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreference ...

  9. android学习五 Intent

    1.Intent是组件间调用的桥梁. 2.Android系统定义了很多Intent    http://developer.android.com/guide/components/intents-c ...

随机推荐

  1. virtual function c++

    之前一直不明白为什么要用虚函数,我只知道这样的规则, Base b = new derived(); b->do(); 调用的是子类的do(): virtue class只是一个虚拟的,调用的是 ...

  2. Python虚拟机之while循环控制结构(三)

    Python虚拟机中的while循环控制结构 在Python虚拟机之if控制流(一)和Python虚拟机之for循环控制流(二)两个章节中,我们介绍了if和for两个控制结构在Python虚拟机中的实 ...

  3. JBuilder生成Exe

    首先保证工程可以通过绿箭头执行 然后在File菜单中选择New,先建立Archive下的Application 接下来的界面中大部分可以直接选择“Next”,除了下面的第3步,会询问是否需要将工程引用 ...

  4. python - unitest - 实战题目

    '''题目要求 1:自己写一个工具类,完成数学的加减乘除以及平方积操作2:对每个方法写2个用例3:针对测试用例选用不同的方法去执行,然后生成测试报告''' '''实现: 3个文件: work_2018 ...

  5. 让boostrap的图片轮播支持滑动效果

    因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果. 然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有 ...

  6. xml报错“cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element”

    配置使用dubbo时,xml报错“cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be ...

  7. 使用 Rails Webpacker 安裝 Foundation 6

    動機 由於 foundation-rails 6.4.1 版本有個 Issue 目前還沒合併.加上 Rails 已經支援了 webpack 2.x.這篇文章純粹紀錄另外一種做法. 準備 開始使用之前需 ...

  8. AWK 用法

     awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS ...

  9. POJ 2033 Alphacode

    Alphacode Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11666   Accepted: 3564 Descri ...

  10. git命令综合

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势.Git常用操作命令:1) 远程仓库相关命令检出仓库:$ git clone git: ...