鸿蒙HarmonyOS 5.0开发实战:网络状态监听实现案例

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

 往期鸿蒙全套实战文章必看:(文中附带鸿蒙全栈学习资料)



  • 鸿蒙开发焦点知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
  • 鸿蒙HarmonyOS NEXT开发技术最全学习路线指南
  • 鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)

网络状态监听

先容

本示例先容如何利用@kit.NetworkKit接口监听手机网络状态,根据差别的网络状态对视频举行播放、停息处理等操作。
效果预览图



利用说明

  • 第一次打开应用进入案例页面,视频不播放。
  • 点击自动播放设置按钮,进入设置页面,开启或者关闭3G/4G/5G自动播放()、WI-FI自动播放。
  • 开启或者关闭手机的蜂窝网络或者WI-FI开关,检察视频是否根据自动播放设置页面中的设置播放或者停息。
  • 返回顾页瀑布流或者杀死应用重新进入案例,检察视频是否根据自动播放设置中的设置和手机网络状态播放或者停息。
实现思绪


  • 页面实现
    1.1 在VideoPage中添加Video组件,设置在线视频播放
    1. ```
    2. Video({
    3.   src: "https://v.oh4k.com/muhou/2022/07/20220704-RIUq3Z.mp4",
    4.    controller: this.controller
    5. }).height(300)
    6.   .width('100%')
    7.   .autoPlay(this.autoPlay())
    8. ```
    复制代码
    1.2 在aboutToAppear方法中添加网络状态监听,并开始监听WI-FI和蜂窝数据的状态。
    1. ```
    2. emitter.on(NetUtils.getInstance().getEmitterEvent(), (data: emitter.EventData) => {
    3.   if (data) {
    4.     this.netObserver(data);
    5.   } else {
    6.     logger.info("aboutToAppear emitter on error, data is undefined.");
    7.   }
    8. });
    9. NetUtils.getInstance().startNetObserve(connection.NetBearType.BEARER_CELLULAR, connection.NetBearType.BEARER_WIFI);
    10. ```
    复制代码
    1.3 在netObserver方法中,添加差别网络状态的处理。
    1. netObserver(data: emitter.EventData) {
    2. ...
    3.   let eventName: NetworkEventName = netEventData.eventName ?? -1;
    4.   switch (eventName) {
    5.     case NetworkEventName.NetAvailable:
    6.       if (netEventData.netType === connection.NetBearType.BEARER_WIFI) {
    7.         if (this.wifiAutoPlay) {
    8.           this.startPlay();
    9.         }
    10.       }
    11.       break;
    12.     case NetworkEventName.NetBlock:
    13.       break;
    14.     case NetworkEventName.NetLost:
    15.       if (netEventData.netType === connection.NetBearType.BEARER_WIFI) {
    16.         this.wifiInterrupt();
    17.       }
    18.       break;
    19.     case NetworkEventName.NetUnavailable:
    20.       if (netEventData.netType === connection.NetBearType.BEARER_WIFI) {
    21.         this.wifiInterrupt();
    22.       }
    23.       break;
    24.     case NetworkEventName.WeakNet:
    25.       // 如果是弱网环境
    26.       if (netEventData.status) {
    27.         Prompt.showToast({ message: "当前网络环境较差,视频播放可能出现卡顿" });
    28.       }
    29.       break;
    30.     default:
    31.       logger.debug("当前网络状态:" + eventName);
    32.       break;
    33.   }
    34. }
    复制代码
    1.4 在SettingPage中添加Toggle组件,管理自动播放设置。
    1. Toggle({ type: ToggleType.Switch, isOn: this.cellularAutoPlay })
    2.   .selectedColor('#007DFF')
    3.   .switchPointColor('#FFFFFF')
    4.   .onChange((isOn: boolean) => {
    5.     logger.info('Component status:' + isOn);
    6.     AppStorage.setOrCreate('cellular_auto_play', isOn);
    7.     PersistentStorage.persistProp('cellular_auto_play', isOn);
    8.   })
    9.   .width('10%')
    复制代码
  • 网络状态监听工具类NetUtils实现,通过@kit.NetworkKit接口监听网络状态,然后通过emitter将监听结果传递给页面。
    2.1 开启网络监听
    1. public startNetObserve(...netType: connection.NetBearType[]) {
    2.   netType.forEach((type: connection.NetBearType) => {
    3.     this.networkObserve(type);
    4.     if (type === connection.NetBearType.BEARER_WIFI) {
    5.       this.wifiStateObserve();
    6.     }
    7.   })
    8. }
    复制代码
    2.2 关闭网络监听
    1. public stopNetObserve(netType: connection.NetBearType) {
    2.   this.connectionMap.get(netType).unregister(() => {
    3.     logger.info("Success unregister:" + netType.toString());
    4.   })
    5. }
    复制代码
    2.3 网络状态监听
    1. networkObserve(netType: connection.NetBearType) {
    2.   let netConnection: connection.NetConnection = connection.createNetConnection({
    3.     netCapabilities: {
    4.       bearerTypes: [netType]
    5.     }
    6.   })
    7.   netConnection.register((error: BusinessError) => {
    8.     let result = true;
    9.     if (error) {
    10.       logger.info("NetUtils", "NetType :" + netType + ", network register failed: " + JSON.stringify(error));
    11.       result = false;
    12.     }
    13.     logger.info("NetUtils", "NetType :" + netType + ", network register succeed");
    14.     this.postEvent(NetworkEventName.NetObserverRegister, result, netType);
    15.   });
    16.   netConnection.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
    17.     logger.info("NetUtils", "NetType :" + netType + ", network netCapabilitiesChange: " + JSON.stringify(data));
    18.     this.postEvent(NetworkEventName.NetCapabilitiesChange, data, netType);
    19.   })
    20.   netConnection.on("netAvailable", (data: connection.NetHandle) => {
    21.     logger.info("NetUtils", "NetType :" + netType + ", network succeeded to get netAvailable: " + JSON.stringify(data));
    22.     // 检查默认数据网络是否被激活,使用同步方式返回接口,如果被激活则返回true,否则返回false。
    23.     this.postEvent(NetworkEventName.NetAvailable, connection.hasDefaultNetSync(), netType);
    24.   });
    25.   // 订阅网络阻塞状态事件,当网络阻塞时,如网络性能下降、数据传输出现延迟等情况时,会触发该事件
    26.   netConnection.on('netBlockStatusChange', (data: connection.NetBlockStatusInfo) => {
    27.     logger.info("NetUtils", "NetType :" + netType + ", network netBlockStatusChange " + JSON.stringify(data));
    28.     this.postEvent(NetworkEventName.NetBlock, data, netType)
    29.   });
    30.   netConnection.on('netConnectionPropertiesChange', (data: connection.NetConnectionPropertyInfo) => {
    31.     logger.info("NetUtils", "NetType :" + netType + ", network netConnectionPropertiesChange " + JSON.stringify(data));
    32.     this.postEvent(NetworkEventName.NetConnectionPropertiesChange, data, netType);
    33.   });
    34.   // 订阅网络丢失事件,当网络严重中断或正常断开时触发该事件
    35.   // 网络丢失是指网络严重中断或正常断开事件,当断开Wi-Fi时,是属于正常断开网络连接,会触发netLost事件
    36.   netConnection.on('netLost', (data: connection.NetHandle) => {
    37.     this.postEvent(NetworkEventName.NetLost, true, netType)
    38.     logger.info("NetUtils", "NetType :" + netType + ", Succeeded to get netLost: " + JSON.stringify(data));
    39.   });
    40.   // 订阅网络不可用事件,当网络不可用时触发该事件
    41.   // 网络不可用是指网络不可用事件,当连接的网络不能使用时,会触发netUnavailable事件。
    42.   netConnection.on('netUnavailable', () => {
    43.     logger.info("NetUtils", "NetType :" + netType + ", Succeeded to get unavailable net event");
    44.     this.postEvent(NetworkEventName.NetUnavailable, true, netType);
    45.   });
    46.   this.connectionMap.set(netType, netConnection);
    47. }
    复制代码
    2.4 通过emitter将网络监听状态传递给页面
    1. private postEvent(eventName: NetworkEventName, status: NetworkData, netType?: connection.NetBearType,
    2.   priority?: emitter.EventPriority) {
    3.   this.emitterEvent.priority = priority;
    4.   emitter.emit(this.emitterEvent, {
    5.     data: new NetEventData(eventName, status, netType)
    6.   })
    7. }
    复制代码
工程结构&模块类型

  1.    networkstatusobserver                              // har类型
  2.    |---pages
  3.    |   |---SettingPage.ets                            // 自动播放设置页面
  4.    |   |---VideoPage.ets                              // 视频播放页面
  5.    |---utils
  6.    |   |---EmitterData.ets                            // emitter数据结构
  7.    |   |---Logger.ets                                 // 日志打印
  8.    |   |---NetUtils.ets                               // 网络监听工具类
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表