鸿蒙开发实战:深度解析网络管理技巧与实战应用

news/2024/11/14 9:02:13/文章来源:https://www.cnblogs.com/bkbk1234/p/18545259

在鸿蒙项目开发中,网络管理扮演着举足轻重的角色。本文将深入剖析鸿蒙网络管理的核心技术,帮助开发者精准把握网络状态,打造流畅且用户友好的应用体验。

在鸿蒙应用中,实时监测网络状态是确保应用稳定性和用户体验的关键。网络状态的变化,如从 Wi-Fi 切换到移动数据,或从有网络状态变为无网络状态,都需要应用做出相应的调整。例如,应用可以暂停正在进行的操作,或向用户发出提醒,以确保应用在各种网络环境下都能稳定运行。

一、实时监测网络状态,智能响应变化

在鸿蒙项目中,构建一个高效的网络管理类是实现流畅应用体验的核心环节。这个管理类能够实时监控网络状态,并在状态发生变化时迅速响应。接下来,我们将深入讨论如何设计一个符合专业要求的网络管理类。

首先,我们定义了网络连接状态变化时的回调函数类型,以便在网络状态变化时能够灵活地执行相应的处理逻辑。

/**

  • 网络连接状态变化回调函数的类型定义
    */
    export type NetworkStatusCallback = (status: NetworkType) => void;

接着,我们利用枚举类型来定义不同的网络状态,使得代码更加清晰、易读且易于维护。

/**

  • 枚举:网络类型
  • 用于标识当前的网络连接状态
    */
    export enum NetworkType {
    STATE_NULL = 'NULL', // 表示未联网状态
    UNKNOWN = 'UNKNOWN', // 未知网络类型
    MOBILE = 'MOBILE', // 移动网络
    WIFI = 'WIFI', // Wi-Fi网络
    ETHERNET = 'ETHERNET' // 以太网网络(尽管移动设备通常不支持,但为完整性保留)
    }

/**

  • 枚举:承载类型(内部使用)
  • 与具体平台的API对接,用于标识网络连接的承载类型
    */
    enum BearerType {
    MOBILE = 0,
    WIFI = 1,
    // ... 其他可能的承载类型,根据平台API添加
    ETHERNET = 3
    }

随后,我们定义了一些私有变量来存储网络管理类的内部状态信息,以及用于与外部交互的回调函数的集合。

class LibNetworkStatus {
/**

  • LibNetworkStatus单例实例
  • 保证全局只有一个网络管理类实例
    */
    private static instance: LibNetworkStatus;

/**

  • 当前网络状态
  • 存储当前的网络连接状态
    */
    private currentNetworkStatus: NetworkType = NetworkType.STATE_NULL;

/**

  • 网络是否可用
  • 标识当前是否有可用的网络连接
    */
    private isNetworkAvailable: boolean = false;

/**

  • 鸿蒙网络连接对象
  • 用于与鸿蒙系统的网络API进行交互
    */
    private networkConnection?: Connection;

/**

  • 存储网络连接状态变化回调函数的集合
  • 当网络状态发生变化时,会遍历此集合并调用相应的回调函数
    */
    private callbacks: Set = new Set();

// 类的构造函数、方法以及其他逻辑实现将在这里继续...
}

通过定义这些变量和回调方法类型,我们为网络管理类的实现奠定了坚实的基础。接下来,我们将进一步实现监听网络状态变化、更新网络状态以及调用回调函数通知应用等核心功能。这些功能的实现将确保我们的网络管理类能够实时、准确地掌握网络状态,并根据状态变化做出相应的处理,从而提升应用的稳定性和用户体验。

二、构建基础回调方法,实现精细化的回调管理

为了确保我们的网络管理系统能够高效且准确地通知应用关于网络状态的变化,我们需要构建一套完善的回调机制。这套机制将允许应用在网络状态变化时及时做出响应,从而提升用户体验。

/**

  • 添加回调方法,用于监听网络状态变化
  • @param callback 监听网络状态变化的回调函数
  • @param isCallBackCurrentNetworkStatus 是否立即调用回调并返回当前网络状态
    */
    addCallback(callback: NetworkStatusCallback, isCallBackCurrentNetworkStatus: boolean): void {
    if (!callback || !this.callbacks) {
    return;
    }

// 确保回调方法未被重复添加
if (this.callbacks.has(callback)) {
return;
}

this.callbacks.add(callback);

// 如果需要,立即调用回调并返回当前网络状态
if (isCallBackCurrentNetworkStatus) {
callback(this.currentNetworkStatus);
}
}

/**

  • 移除指定的回调方法
  • @param callback 需要移除的回调方法
    */
    removeCallback(callback: NetworkStatusCallback): void {
    if (!callback || !this.callbacks || !this.callbacks.has(callback)) {
    return;
    }

this.callbacks.delete(callback);
}

/**

  • 通知所有注册的回调方法当前的网络状态
  • 当网络状态发生变化时,此方法将被调用,以通知所有注册的回调方法
    */
    callbackNetworkStatus(): void {
    if (!this.callbacks || this.callbacks.size === 0) {
    return;
    }

// 遍历所有注册的回调方法,并调用它们,传递当前网络状态
this.callbacks.forEach(callback => {
callback(this.currentNetworkStatus);
});
}

代码分析:

回调方法添加与移除:我定义了两个方法addCallback和removeCallback,用于添加和移除监听网络状态变化的回调方法。这确保了应用的灵活性和可扩展性,因为应用可以根据需要在运行时动态地添加或移除回调。

回调方法管理:使用Set数据结构来管理回调方法,这确保了回调方法的唯一性,避免了重复调用和潜在的内存泄漏问题。

立即回调机制:在addCallback方法中,我们提供了一个选项isCallBackCurrentNetworkStatus,允许在添加回调时立即调用该回调并返回当前的网络状态。这为那些需要立即知道当前网络状态的应用提供了方便。

状态通知:callbackNetworkStatus方法负责在网络状态发生变化时通知所有注册的回调方法。通过遍历Set中的每个回调方法并调用它们,我们确保了所有感兴趣的应用部分都能及时收到网络状态变化的通知。

三、网络相关的核心方法

1、获取网络状态信息

在构建网络管理类时,提供一套准确且高效的网络状态获取方法至关重要。这些方法允许我们实时地监控网络情况,并根据不同的网络状态做出相应的处理。接下来,我们将详细介绍这些核心方法。

/**

  • 检查当前网络是否可用
  • @returns 返回一个布尔值,指示当前网络是否可用
    */
    isNetworkAvailable(): boolean {
    return this.isNetworkAvailable;
    }

/**

  • 获取当前的网络状态
  • @returns 返回当前的网络状态码
    */
    getCurrentNetworkStatus(): NetworkType {
    return this.currentNetworkStatus;
    }

2、精准检测并获取当前网络类型

/**

  • 获取当前的网络类型
  • 此方法通过调用系统API获取当前网络状态,并根据承载类型确定网络类型。
  • 通过精准的判断逻辑,确保获取到的网络类型准确无误。
    */

getDefaultNetSync () {
//获得当前网络状态
let netHandle = connection.getDefaultNetSync()
if (netHandle) {
let capabilities = connection.getNetCapabilitiesSync(netHandle)
LibLogManager.getLogger().debug(TAG,'getNetCapabilitiesSync:' + JSON.stringify(capabilities))
if (capabilities && capabilities.bearerTypes && capabilities.bearerTypes.length > 0) {

  // 获取第一个承载类型const bearerType = capabilities.bearerTypes[0];// 根据承载类型判断网络类型switch (bearerType) {case BearerType.MOBILE.valueOf():// 蜂窝网络this.currentNetworkStatus =  NetworkType.MOBILE;break;case BearerType.WIFI.valueOf():// Wi-Fi网络this.currentNetworkStatus =  NetworkType.WIFI;break;case BearerType.ETHERNET.valueOf():// 以太网网络(通常移动设备不支持,但为完整性保留)this.currentNetworkStatus =  NetworkType.ETHERNET;break;default:// 未知网络类型this.currentNetworkStatus =  NetworkType.UNKNOWN;break;}}

}
}

代码分析:

使用getNetCapabilitiesSync方法获取网络能力信息,包括承载类型列表。

3、注册监听手机网络状态变化

首先,我们需要理解网络状态变化的几种主要类型:从无网络到有网络、从有网络到无网络、以及从一种网络类型切换到另一种网络类型(如从 Wi-Fi 切换到蜂窝数据)。这些状态变化都需要应用进行相应的处理,比如重新加载数据、暂停某些操作或者提示用户当前的网络状态。

/**

  • 注册网络状态监听:
  • 设备从无网络到有网络会触发"netAvailable"、"netCapabilitiesChange"、"netConnectionPropertiesChange"事件;
  • 设备从有网络到无网络会触发"netLost"事件
  • 设备从wifi到蜂窝网络会触发"netLost"事件(wifi不可用)、之后触发"netAvailable"事件(蜂窝可用)
    */
    registerNetConnectListener () {
    if (this.networkConnectio) {
    console.debug(TAG,'已订阅网络事件,无需再次订阅')
    return
    }

//创建NetConnection对象
this.networkConnectio = connection.createNetConnection()

//判断默认网络状态
let hasDefaultNet = connection.hasDefaultNetSync()
if (hasDefaultNet) {
console.debug(TAG,'hasDefaultNetSync ' + hasDefaultNet)
this.isAvailable = true
//获得默认网络类型
this.getDefaultNetSync()
}

//注册
this.networkConnectio.register((error) => {
if (error) {
console.debug(TAG,'networkConnectio.register failure: ' + JSON.stringify(error))
} else {
console.debug(TAG,' networkConnectio.register success')
}
})
cbwe.wekochat.com,cbwe.hndsedu.com,cbwe.zjbhzs.com
cbwe.lovehua99.com,cbwe.re-shake.com
//订阅网络可用事件
console.debug(TAG,'订阅网络可用事件-->')
this.networkConnectio.on('netAvailable', (data: connection.NetHandle) => {
LibLogManager.getLogger().debug(TAG,'netAvailable:' + JSON.stringify(data))
this.isAvailable = true

//获得默认网络类型
this.getDefaultNetSync()//回调网络状态
this.callbackNetworkStatus()

})

//订阅网络丢失事件
console.debug(TAG,'订阅网络丢失事件-->')
this.networkConnectio.on('netLost', (data: connection.NetHandle) => {
console.debug(TAG,'netLost:' + JSON.stringify(data))
this.isAvailable = false
this.currentNetworkStatus = NetworkType.STATE_NULL
cbwe.51jyo.com,cbwe.bctiantuo.com,cbwe.jiaforhui.com
cbwe.bjyins.com,cbwe.chinabgroup.com
//回调网络状态
this.callbackNetworkStatus()
})

//订阅网络不可用事件
console.debug(TAG,'订阅网络不可用事件-->')
this.networkConnectio.on('netUnavailable', () => {
LibLogManager.getLogger().debug(TAG,'netUnavailable')
this.isAvailable = false
this.currentNetworkStatus = NetworkType.STATE_NULL

//回调网络状态
this.callbackNetworkStatus()

})
}

综上所述,鸿蒙网络管理功能为开发者提供了强大的支持,帮助我们精准把握网络状态,打造流畅且用户友好的应用体验。通过深入了解鸿蒙网络管理的核心技术,我们可以更好地应对各种网络环境下的挑战,为用户带来更好的使用体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833287.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac和安卓手机互传文件(ADB)

点赞 + 关注 + 收藏 = 学会了 本文简介 今年的 Mac mini M4 真的鲨疯了,丐版原价4字头,领到国补的3字头可以拿下。相信很多想体验 macOS 的工友都蠢蠢欲动了。 但是,电脑便宜了,手机可不便宜。对于正在使用 「苹果电脑 + 安卓手机」 的工友来说,想让这两设备互传体积大、数…

什么是数字图像?

点赞 + 关注 + 收藏 = 学会了 什么是数字图像? 弄懂数字图像的概念对学习计算机视觉很有帮助。 那么,什么是数字图像? 字面意思,数字图像就是有数字组成图像。通常由像素(Pixel)组成,每个像素包含颜色或亮度信息。数字图像的格式包括位图和矢量图两种主要类型:位图图像…

经销商文件外发,如何实现安全与效率的双赢?

经销商文件外发是指经销商在业务运营过程中,与供应商、客户、合作伙伴以及其他相关方之间进行的文件接收和发送活动。这些文件涵盖了订单、发票、合同、产品目录、库存报告、市场活动资料、运输单据、客户反馈等多种类型,对于经销商的日常运营、业务管理、客户关系维护以及决…

发布的网站代码修改,如何在生产环境中安全地修改已发布的网站代码

在生产环境中修改已发布的网站代码需要谨慎操作,以确保网站的稳定性和安全性。以下是具体步骤:备份网站:在修改前,备份当前的网站文件和数据库,确保数据安全。 使用FTP工具或数据库管理工具进行备份。创建测试环境:在本地或开发服务器上创建一个与生产环境一致的测试环境…

织梦网站在哪里修改图片的alt,如何在织梦后台或代码编辑器中修改图片的Alt属性

登录织梦后台:打开浏览器,输入织梦网站的后台地址,例如 http://yourdomain.com/dede。 输入管理员账号和密码,点击“登录”。进入内容管理:登录后,点击顶部菜单栏中的“内容”。 选择“文档管理”或“文章管理”。选择需要修改的文章:在文档管理页面中,找到需要修改的文…

修改网站模板布局的软件,如何使用专业的软件修改网站模板布局

使用专业的软件可以更高效地修改网站模板布局。以下是一些常用的软件及其使用方法:Adobe Dreamweaver:安装软件:从Adobe官网下载并安装Dreamweaver。 打开项目:使用Dreamweaver打开网站项目文件夹。 修改布局:在设计视图中拖放元素,调整布局。 保存文件:修改完成后,保存…

Mysql篇-三大日志

概述undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC。 redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复; binlog (归档日志):是 Server 层生成的日志,主要…

客户端 web 测试

单功能测试 单功能: 软件程序或应用程序只提供一项核心功能或特性, 而不包含其他附加功能. 这些功能都是独立的.以测试登录功能为例, 要测试登录的话, 要先准备一些资料, 最常见的资料有产品的原型设计, 以及设计的时候的需求文档, 有了这些数据之后应该如何开展测试呢?要把这…

memtest86测试工具排查内存故障

该方法适用于服务器数量较多的场景,通过BMC挂载镜像文件逐个进行测试。 1、将memtest86-pro-usb.zip解压。2、打开BMC的Java控制台,在Virtual Media菜单中选择Virtual Storage3、在Virtual Storage对话框中,Logical Drive Type选择HD Image,然后选择本机的memtest86-pro-us…

Microsoft System Center 2025 Multilanguage - Windows 服务器管理软件

Microsoft System Center 2025 Multilanguage - Windows 服务器管理软件Microsoft System Center 2025 Multilanguage - Windows 服务器管理软件 Windows 服务器部署、配置、管理和监控软件 请访问原文链接:https://sysin.org/blog/microsoft-system-center-2025/ 查看最新版。…

dotnet 记龙芯麒麟教育版安全中心拦截文件 导致 docker 内 CI CD 构建失败

本文记录我在龙芯旧世界的麒麟教育版系统上,使用 docker 对 dotnet 进行构建和打包过程中,因为安全中心拦截而出现奇怪的问题以下是我打包构建过程中遇到的文件没权限或被占用或 Mutex 失败等信息 使用 GitLab Runner 拉取项目时,遇到的报错信息如下 Running with gitlab-ru…

dotnet 9 WPF 连字符渲染支持

连字符渲染功能是 WPF 呼声很高的一个功能,核心需求方是使用 Visual Studio 的开发者们。开发者们期望使用连字符的时候可以进行连字符渲染,让开发过程中的视觉效果更加。于是作为 Visual Studio 的基础设施的 WPF 就要承担此功能的实现。经过漫长的开发,终于在 dotnet 9 里…