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

继承了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. Linux学习-额外(单一)核心模块编译

    编译前注意事项 由于我们的核心原本就有提供很多的核心工具给硬件开发商来使用, 而硬件开发商也需要针对核心 所提供的功能来设计他们的驱动程序模块,因此, 我们如果想要自行使用硬件开发商所提供的模块 来进 ...

  2. 关于mysql中select出数据未排序问题

    来自  mysql必知必会

  3. luogu3370 【模板】字符串哈希

    #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...

  4. 25、Base64

    Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3 ...

  5. rails提供的validators

    Instance Public methods attribute_method?(attribute)Link Returns true if attribute is an attribute m ...

  6. Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用

    Map接口 ①   映射(map)是一个存储键/值对的对象.给定一个键,可以查询到它的值,键和值都是对象; ②   键必须是唯一的,值可以重复; ③   有些映射可以接收null键和null值,而有的 ...

  7. 测试openssl_encrypt

    <?php //$string = 'It works ? Or not it works ?'; //$pass = '1234'; //$method = 'aes128'; // // / ...

  8. 在Python中建立N维数组并赋初值

    在Python中,由于不像C++/Java这样的语言可以方便的用a[i][j]=0的方式,建立二维数组并赋初值,所以需要一个相对巧妙的方法. 可以用列表解析的方式,eg: >>> m ...

  9. Welcome-to-Swift-01基础部分

    Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的. Swift 的类型是在 C ...

  10. 【bzoj4260】Codechef REBXOR Trie树

    题目描述 输入 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. 输出 输出一行包含给定表达式可能的最大值. 样例输入 5 1 2 3 1 2 样例输出 ...