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

2023-11-22 14:18

本文主要是介绍Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接


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

继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionClosedOnError()

前者为连接正常断开,后者是连接异常断开,不管是正常还是异常,我们都要监听到

这里写了一个定时器,两秒进行连接一次,注释写的也很清楚,不做太多介绍

要注意的是我把用户名和密码都存到sharePreferences中了


[java]  view plain copy
  1. package com.techrare.listener;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import org.jivesoftware.smack.ConnectionListener;  
  7.   
  8. import android.util.Log;  
  9.   
  10. import com.techrare.taxicall.MainActivity;  
  11. import com.techrare.utils.Utils;  
  12. import com.techrare.utils.XmppConnection;  
  13.   
  14. /** 
  15.  * 连接监听类 
  16.  *  
  17.  * @author Administrator 
  18.  *  
  19.  */  
  20. public class TaxiConnectionListener implements ConnectionListener {  
  21.     private Timer tExit;  
  22.     private String username;  
  23.     private String password;  
  24.     private int logintime = 2000;  
  25.   
  26.     @Override  
  27.     public void connectionClosed() {  
  28.         Log.i("TaxiConnectionListener""連接關閉");  
  29.         // 關閉連接  
  30.         XmppConnection.getInstance().closeConnection();  
  31.         // 重连服务器  
  32.         tExit = new Timer();  
  33.         tExit.schedule(new timetask(), logintime);  
  34.     }  
  35.   
  36.     @Override  
  37.     public void connectionClosedOnError(Exception e) {  
  38.         Log.i("TaxiConnectionListener""連接關閉異常");  
  39.         // 判斷為帳號已被登錄  
  40.         boolean error = e.getMessage().equals("stream:error (conflict)");  
  41.         if (!error) {  
  42.             // 關閉連接  
  43.             XmppConnection.getInstance().closeConnection();  
  44.             // 重连服务器  
  45.             tExit = new Timer();  
  46.             tExit.schedule(new timetask(), logintime);  
  47.         }  
  48.     }  
  49.   
  50.     class timetask extends TimerTask {  
  51.         @Override  
  52.         public void run() {  
  53.             username = Utils.getInstance().getSharedPreferences("taxicall",  
  54.                     "account", MainActivity.context);  
  55.             password = Utils.getInstance().getSharedPreferences("taxicall",  
  56.                     "password", MainActivity.context);  
  57.             if (username != null && password != null) {  
  58.                 Log.i("TaxiConnectionListener""嘗試登錄");  
  59.                 // 连接服务器  
  60.                 if (XmppConnection.getInstance().login(username, password)) {  
  61.                     Log.i("TaxiConnectionListener""登錄成功");  
  62.                 } else {  
  63.                     Log.i("TaxiConnectionListener""重新登錄");  
  64.                     tExit.schedule(new timetask(), logintime);  
  65.                 }  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     @Override  
  71.     public void reconnectingIn(int arg0) {  
  72.     }  
  73.   
  74.     @Override  
  75.     public void reconnectionFailed(Exception arg0) {  
  76.     }  
  77.   
  78.     @Override  
  79.     public void reconnectionSuccessful() {  
  80.     }  
  81.   
  82. }  

其次就是给连接设置监听器了,最好放在登录方法里,关闭连接方法里移除监听

[java]  view plain copy
  1. // 添加連接監聽  
  2. TaxiConnectionListener connectionListener = new TaxiConnectionListener();  
  3. getConnection().addConnectionListener(connectionListener);  
[java]  view plain copy
  1. connection.removeConnectionListener(connectionListener);  

先介绍到这里~

这篇关于Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410730

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经