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

继承了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)——Bash特性

    一.shell的基本概念:                               shell 意思是外壳,它是离用户最近的程序.shell提供用户操作系统的接口,我们通过shell将输入的命令与 ...

  2. [python IO学习篇]补充打开中文路径的文件

    http://blog.csdn.net/mottolinux/article/details/525600621 关于Python编码的基本常识 在python里面 “明文”是unicode类型和s ...

  3. equals()和hashCode()方法在集合类set中的使用

    Object的方法 equals()和hashCode() 是用来判断两个对象是否相等.基础类型判断是否相等时,使用“==”来判断,按java的说话,“==”当用来判断是基础类型是判断内容的,而引用对 ...

  4. sgen.exe 未能运行

    指定的任务可执行文件“sgen.exe”未能运行.文件名或扩展名太长. 解决方式,右键项目属性->生成  把下图红框的“开”设置成“自动”

  5. jQUery中的$(document).ready()方法和window.onload()方法的区别

    1.常规的Javascript代码中,通常使用window.onload方法 window.onload = function(){//代码} 2.jquery中,则使用$(document).rea ...

  6. Codeforces834D - The Bakery

    Portal Description 给出一个\(n(n\leq35000)\)个数的数列\(\{a_i\}\)和\(m(m\leq50)\).将原数列划分成\(m\)个连续的部分,每个部分的权值等于 ...

  7. 刷题总结——影魔(HNOI2017 BZOJ4826 线段树+扫描线)

    题目: Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄 ...

  8. log4j.xml——java日志处理组件配置简介

    (从一篇好文开始)log4j(一)——为什么要用log4j? 三:看完栗子后的感想 (1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候:我们的应用出现了问题,我们分析. ...

  9. no main manifest attribute, in demo-1.0.jar

    今天想打包一个jar到Linux上运行,发现使用java -jar demo-1.0.jar 运行报错: no main manifest attribute, in demo-1.0.jar 解决方 ...

  10. FOJ Problem 2261 浪里个浪

                                                                                                        ...