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

继承了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. Latex:插入伪代码

    *本文属于转载. *转载链接:https://blog.csdn.net/lwb102063/article/details/53046265 目录 clrscode algorithm algori ...

  2. bash实例-参数/函数/统计IP

    1.写一个脚本getinterface.sh,脚本可以接受参数(i,I,a),完成以下任务:   (1)使用以下形式:getinterface.sh [-i interface|-I IP|-a]  ...

  3. flask_关注者

    表的模型实现 class Follow(db.Model): __tablename__ = 'follows' follower_id = db.Column(db.Integer,db.Forei ...

  4. RHEL6.X设置163yum源

    目录 RHEL6.X设置163yum源 卸载系统的yum 检查是否已经卸载完成 下载yum以及相关包 安装yum相关rpm包 清除原有缓存,建立yum列表 本地yum源设置 挂载本地光盘 修改配置文件 ...

  5. SpringBoot 项目打包部署Resin遇到的问题

    1)javax/validation/ParameterNameProvider 找不到. 解决:A) resin/lib 目录下删掉原来的,validation-api 更新为 validation ...

  6. 大数据学习——SparkStreaming整合Kafka完成网站点击流实时统计

    1.安装并配置zk 2.安装并配置Kafka 3.启动zk 4.启动Kafka 5.创建topic [root@mini3 kafka]# bin/kafka-console-producer. -- ...

  7. bootstrap里的fileimput的小问题

    fileinput 是bootstrap 里面一个非常好的插件 于是我很开心的开始的使用了 $("#file_upload").fileinput({ uploadUrl: &qu ...

  8. Install Oracle 11G Release 2 (11.2) on Oracle Linux 7 (OEL7)

    Install Oracle 11G Release 2 (11.2) on Oracle Linux 7 (OEL7) This article presents how to install Or ...

  9. JAVA-STRUTS-2x的项目配置

    首先是web.xml的配置,这个是项目加载的开始. <display-name></display-name> <!--struts2配置开始--> <fil ...

  10. Set容器——HashSet及常用API

    Set容器特点: ①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ②   最常用的两个Set接口的实 ...