openfire Android学习(五)------连接断开重连
首先要创建连接监听器,用来监听连接状态,这里我写了一个类
继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionClosedOnError()
前者为连接正常断开,后者是连接异常断开,不管是正常还是异常,我们都要监听到
这里写了一个定时器,两秒进行连接一次,注释写的也很清楚,不做太多介绍
要注意的是我把用户名和密码都存到sharePreferences中了
- package com.techrare.listener;
- import java.util.Timer;
- import java.util.TimerTask;
- import org.jivesoftware.smack.ConnectionListener;
- import android.util.Log;
- import com.techrare.taxicall.MainActivity;
- import com.techrare.utils.Utils;
- import com.techrare.utils.XmppConnection;
- /**
- * 连接监听类
- *
- * @author Administrator
- *
- */
- public class TaxiConnectionListener implements ConnectionListener {
- private Timer tExit;
- private String username;
- private String password;
- private int logintime = 2000;
- @Override
- public void connectionClosed() {
- Log.i("TaxiConnectionListener", "連接關閉");
- // 關閉連接
- XmppConnection.getInstance().closeConnection();
- // 重连服务器
- tExit = new Timer();
- tExit.schedule(new timetask(), logintime);
- }
- @Override
- public void connectionClosedOnError(Exception e) {
- Log.i("TaxiConnectionListener", "連接關閉異常");
- // 判斷為帳號已被登錄
- boolean error = e.getMessage().equals("stream:error (conflict)");
- if (!error) {
- // 關閉連接
- XmppConnection.getInstance().closeConnection();
- // 重连服务器
- tExit = new Timer();
- tExit.schedule(new timetask(), logintime);
- }
- }
- class timetask extends TimerTask {
- @Override
- public void run() {
- username = Utils.getInstance().getSharedPreferences("taxicall",
- "account", MainActivity.context);
- password = Utils.getInstance().getSharedPreferences("taxicall",
- "password", MainActivity.context);
- if (username != null && password != null) {
- Log.i("TaxiConnectionListener", "嘗試登錄");
- // 连接服务器
- if (XmppConnection.getInstance().login(username, password)) {
- Log.i("TaxiConnectionListener", "登錄成功");
- } else {
- Log.i("TaxiConnectionListener", "重新登錄");
- tExit.schedule(new timetask(), logintime);
- }
- }
- }
- }
- @Override
- public void reconnectingIn(int arg0) {
- }
- @Override
- public void reconnectionFailed(Exception arg0) {
- }
- @Override
- public void reconnectionSuccessful() {
- }
- }
其次就是给连接设置监听器了,最好放在登录方法里,关闭连接方法里移除监听
- // 添加連接監聽
- TaxiConnectionListener connectionListener = new TaxiConnectionListener();
- getConnection().addConnectionListener(connectionListener);
- connection.removeConnectionListener(connectionListener);
openfire Android学习(五)------连接断开重连的更多相关文章
- Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连
学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接 首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面 ...
- zookeeper 大量连接断开重连原因排查
转自:http://blog.csdn.net/hengyunabc/article/details/41450003?utm_source=tuicool&utm_medium=referr ...
- openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等
openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室. 虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- openfire Android学习(六)----总结
Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...
- android学习五---OpenCV for android环境搭建
学习android的目的是想在手机上实现计算机视觉的算法.一般算法的研究都是在Matlab上进行,但是手机平台没有那么多的计算资源,用matlab显然是不太现实的.而OpenCV是基于C++语言编写的 ...
- openfire Android学习---android客户端聊天开发之登录 和 注销登录
一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...
- Android学习五:Content Provider 使用
1ContentProvider相关知识1.1在安卓应用中,通过文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreference ...
- android学习五 Intent
1.Intent是组件间调用的桥梁. 2.Android系统定义了很多Intent http://developer.android.com/guide/components/intents-c ...
随机推荐
- 《鸟哥的Linux私房菜》学习笔记(2)——Bash特性
一.shell的基本概念: shell 意思是外壳,它是离用户最近的程序.shell提供用户操作系统的接口,我们通过shell将输入的命令与 ...
- [python IO学习篇]补充打开中文路径的文件
http://blog.csdn.net/mottolinux/article/details/525600621 关于Python编码的基本常识 在python里面 “明文”是unicode类型和s ...
- equals()和hashCode()方法在集合类set中的使用
Object的方法 equals()和hashCode() 是用来判断两个对象是否相等.基础类型判断是否相等时,使用“==”来判断,按java的说话,“==”当用来判断是基础类型是判断内容的,而引用对 ...
- sgen.exe 未能运行
指定的任务可执行文件“sgen.exe”未能运行.文件名或扩展名太长. 解决方式,右键项目属性->生成 把下图红框的“开”设置成“自动”
- jQUery中的$(document).ready()方法和window.onload()方法的区别
1.常规的Javascript代码中,通常使用window.onload方法 window.onload = function(){//代码} 2.jquery中,则使用$(document).rea ...
- Codeforces834D - The Bakery
Portal Description 给出一个\(n(n\leq35000)\)个数的数列\(\{a_i\}\)和\(m(m\leq50)\).将原数列划分成\(m\)个连续的部分,每个部分的权值等于 ...
- 刷题总结——影魔(HNOI2017 BZOJ4826 线段树+扫描线)
题目: Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄 ...
- log4j.xml——java日志处理组件配置简介
(从一篇好文开始)log4j(一)——为什么要用log4j? 三:看完栗子后的感想 (1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候:我们的应用出现了问题,我们分析. ...
- 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 解决方 ...
- FOJ Problem 2261 浪里个浪
...
