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

相关文章

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和