首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客191523452号
移动开发
发布于北京
关注
已关注
取消关注
@牛客191523452号:
鸿蒙开发实战:深度解析网络管理技巧与实战应用
简介:在鸿蒙项目开发中,网络管理扮演着举足轻重的角色。本文将深入剖析鸿蒙网络管理的核心技术,帮助开发者精准把握网络状态,打造流畅且用户友好的应用体验。在鸿蒙应用中,实时监测网络状态是确保应用稳定性和用户体验的关键。网络状态的变化,如从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<NetworkStatusCallback> = 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') } }) //订阅网络可用事件 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 //回调网络状态 this.callbackNetworkStatus() }) //订阅网络不可用事件 console.debug(TAG,'订阅网络不可用事件-->') this.networkConnectio.on('netUnavailable', () => { LibLogManager.getLogger().debug(TAG,'netUnavailable') this.isAvailable = false this.currentNetworkStatus = NetworkType.STATE_NULL //回调网络状态 this.callbackNetworkStatus() })}综上所述,鸿蒙网络管理功能为开发者提供了强大的支持,帮助我们精准把握网络状态,打造流畅且用户友好的应用体验。通过深入了解鸿蒙网络管理的核心技术,我们可以更好地应对各种网络环境下的挑战,为用户带来更好的使用体验。
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 20:08
网易_测开(实习员工)
26届二本身边的实习情况
现在网上两种声音最多:一种是没有实习的,另一种是在大厂实习现在开始冲刺校招的我所处的二本,身边几乎没见过在外面实习的,大多数都是这个暑假找到第一份当地的/学校对口安排的实习(基本就见过的一个从大一差不多决定就业的大佬,现在已经进互联网大厂了);反观现在动不动大一大二大厂实习的,26人均手里三段实习or多段大厂的,更不用说还有很多92✌们据身边看到的,差不多是旱的旱死,涝的涝死,最后希望大家都不要太过于焦虑,总能找到工作的,天塌不下来的
双非能在秋招上岸吗?
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
07-16 18:03
啥???清华大学招我
莫名其妙在SSOB上收到了清华hr消息,哈哈哈很荣幸
牛客55695438...:
KPI不用想了,之前面过一回。
点赞
评论
收藏
分享
06-15 22:32
广东技术师范大学天河学院 Java
继续找实习,还是全力冲秋招
我是个普通的二本学校,已经沟通几百家公司了找不到实习,但是秋招快来了,我怕耽误时间,是要边找实习边准备秋招,还是全力准备秋招
等oc的鲸鱼很踏实:
有点迷茫了,现在准备秋招的话,要提前准备八股以及算法题,现在找实习的话有点难找
无实习如何秋招上岸
点赞
评论
收藏
分享
06-24 11:43
湖南农业大学 全栈开发
毕业了,我好像凉了
🌝前端,早知道进校企合作了,室友不愁了,我出租屋蹲了一个月。佬,路在何方?
点赞
评论
收藏
分享
昨天 09:41
门头沟学院 客户端其它
给公司上一课
事情的起因是,我一哥们在实习的时候,导师给他弄了个测试库,让他在里面先熟悉熟悉,没想到在这个过程中,他误操作,切到了生产环境的数据库,然后还执行了删除操作,直接给数据全干没了,然后他拼命上百度搜怎么解决,也没找到方法,只能找导师摊牌,当时整组都震惊了,直接去会议室开会,商量怎么解决,后来,好在有备份,但是备份最新数据日期是前一个月的,导致损失了1个月的数据,只能一点一点追溯,也是因为他,他们公司给数据库加了权限,也算是给公司上一课了。#牛客AI配图神器#
菜鸡芊寻:
数据库权限没控制好是领导的问题不是实习生的问题
实习最想跑路的瞬间
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
0实习0面试, 速通拼多多
1.3W
2
...
秋招腾讯TEG提前批(三面挂)
1.1W
3
...
玛勒戈壁得秋天到了吗就秋招。恨不得搁产房外面招聘
6163
4
...
我和妈妈讲以后我可能给不了她一个月1500
5552
5
...
后端实习到底该干什么啊
4278
6
...
双非本应届是如何拿到30
3840
7
...
明天五场面试,加油
3410
8
...
王侯将相宁有种乎!
3193
9
...
实习,别太较真
3056
10
...
从外包到正式工,从Java开发到私有云运维:我的职场逆袭之路
2930
创作者周榜
更多
正在热议
更多
#
26届的你们有几段实习?
#
33157次浏览
391人参与
#
机械人,你拿到几个offer啦
#
38300次浏览
318人参与
#
你被哪些公司秒挂过?
#
25176次浏览
221人参与
#
面试体验感最好的是哪家?
#
223030次浏览
2378人参与
#
如何提高实习转正率?
#
9598次浏览
147人参与
#
双非能在秋招上岸吗?
#
219898次浏览
1163人参与
#
哪些公司校招卡第一学历
#
63499次浏览
240人参与
#
初创公司值得加入吗?
#
26033次浏览
189人参与
#
大疆的机械笔试比去年难吗
#
74854次浏览
636人参与
#
月薪多少能在一线城市生存
#
16534次浏览
229人参与
#
你后悔自己读研吗?
#
13513次浏览
212人参与
#
大家每天通勤多久?
#
48261次浏览
353人参与
#
当下环境,你会继续卷互联网,还是看其他行业机会
#
116202次浏览
804人参与
#
你认为哪些项目算烂大街?
#
13376次浏览
252人参与
#
你以为的实习VS真实的实习
#
18296次浏览
179人参与
#
设计人的面试记录
#
129194次浏览
1355人参与
#
比亚迪求职进展汇总
#
735619次浏览
3095人参与
#
网申一定要掌握的小技巧
#
10148次浏览
66人参与
#
你小时候最想从事什么职业
#
103794次浏览
1787人参与
#
机械校招之路总结
#
92989次浏览
1891人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务