HarmonyOS NEXT实战:网络状态监控

简介: 本教程介绍如何在HarmonyOS Next中使用@ohos.net.connection模块实现网络状态监控,并通过AppStorage进行状态管理,适用于教育场景下的网络检测功能开发。

HarmonyOS Next实战##HarmonyOS SDK应用服务##教育

参考资料:
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-network-61

@ohos.net.connection (网络连接管理)
网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。

connection.createNetConnection
创建一个NetConnection对象,netSpecifier指定关注的网络的各项特征;timeout是超时时间(单位是毫秒);netSpecifier是timeout的必要条件,两者都没有则表示关注默认网络。

思路:通过使用 @ohos.net.connection 的能力,在网络连接状态发生变化时,判断当前网络是否可以访问互联网,并将判断结果存储到 AppStorage 中。需要判断网络连接状态时,直接从 AppStorage 获取结果。

前提条件:
修改module.json5配置文件,增加网络权限:

    "requestPermissions": [
      {
   
        "name": "ohos.permission.INTERNET"
      },
      {
   
        "name": "ohos.permission.GET_NETWORK_INFO"
      }
    ]

增加NetworkUtil 工具类:

import {
    connection } from "@kit.NetworkKit";
import {
    BusinessError } from "@kit.BasicServicesKit";
import {
    promptAction } from "@kit.ArkUI";
import {
    hilog } from "@kit.PerformanceAnalysisKit";

export class NetworkUtil {
   
  private static netConnection: connection.NetConnection | undefined = undefined;
  public static JUDGE_NET_TAG: string = 'NetworkUtil.netConnection.isUseful';

  /**
   * 工具注册。
   * 作用:监控网络状态
   */
  static register() {
   
    if (NetworkUtil.netConnection === undefined) {
   
      NetworkUtil.init();
    }
  }

  /**
   * 获取网络连接状态
   * @returns boolean
   * true: 有网络
   * false: 无网络
   */
  static getStatus(): boolean {
   
    return NetworkUtil.judgeHasNet()
  }

  static continueWhenNetUsable(callback: () => void) {
   
    if (NetworkUtil.getStatus()) {
   
      callback()
    } else {
   
      promptAction.showToast({
   
        message: 'The network is not worked, please check your network',
        duration: 2000
      });
    }
  }

  private static init() {
   
    NetworkUtil.netConnection = connection.createNetConnection();
    NetworkUtil.netConnection.register(() => {
   
      Logger.info('connection register success');
    });

    NetworkUtil.netConnection.on('netAvailable', (data) => {
   
      Logger.info('NetworkUtil netAvailable ');
      AppStorage.setOrCreate(NetworkUtil.JUDGE_NET_TAG, NetworkUtil.judgeHasNet());
    });

    NetworkUtil.netConnection.on('netUnavailable', () => {
   
      Logger.info('NetworkUtil netUnavailable ');
      AppStorage.setOrCreate(NetworkUtil.JUDGE_NET_TAG, NetworkUtil.judgeHasNet());
    });

    NetworkUtil.netConnection.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
   
      Logger.info('NetworkUtil netCapabilitiesChange');
      AppStorage.setOrCreate(NetworkUtil.JUDGE_NET_TAG, NetworkUtil.judgeHasNet());
    });

    // 订阅网络连接信息变化事件。调用register后,才能接收到此事件通知
    NetworkUtil.netConnection.on('netConnectionPropertiesChange', (data: connection.NetConnectionPropertyInfo) => {
   
      Logger.info('NetworkUtil netConnectionPropertiesChange');
      AppStorage.setOrCreate(NetworkUtil.JUDGE_NET_TAG, NetworkUtil.judgeHasNet());
    });

    NetworkUtil.netConnection.on('netLost', () => {
   
      Logger.info('NetworkUtil netLost');
      AppStorage.setOrCreate(NetworkUtil.JUDGE_NET_TAG, NetworkUtil.judgeHasNet());
    });
  }

  private static judgeHasNet(): boolean {
   
    try {
    // 获取当前网络连接
      let netHandle = connection.getDefaultNetSync();

      // 0-100 为系统预留的连接
      if (!netHandle || netHandle.netId < 100) {
   
        return false;
      }

      // 获取连接的属性
      let netCapability = connection.getNetCapabilitiesSync(netHandle);
      let cap = netCapability.networkCap;
      if (!cap) {
   
        return false;
      }

      for (let em of cap) {
   
        if (connection.NetCap.NET_CAPABILITY_VALIDATED === em) {
   
          return true;
        }
      }
    } catch (e) {
   
      let err = e as BusinessError;
      Logger.info('get netInfo error :' + JSON.stringify(err));
    }
    return false;
  }
}

class Logger{
   
  static info(...args: string[]){
   
    hilog.info(0x0000, '-logger-', getFormat(args), args);
  }
}

function getFormat(args: string[]) {
   
  let format = ''
  for (let i = 0; i < args.length; i++) {
   
    if (i == 0) {
   
      format = '%{public}s'
    } else {
   
      format += ', %{public}s'
    }
  }
  return format
}

页面NetworkUtilPage使用示例代码:

import {
    NetworkUtil } from '../../utils/NetworkUtil'
import {
    promptAction } from '@kit.ArkUI';

@Entry
@Component
struct NetworkUtilPage {
   
  //用法一:通过状态管理实时获取网络状态
  @StorageProp(NetworkUtil.JUDGE_NET_TAG)
  isNetConnectionUseful: boolean = true;

  aboutToAppear(): void {
   
    NetworkUtil.register()
  }

  build() {
   
    Column({
    space: 10 }) {
   
      Text('NetworkUtil Page')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)

      Text() {
   
        Span('watch network status is ')
        Span(JSON.stringify(this.isNetConnectionUseful))
          .fontColor(this.isNetConnectionUseful ? Color.Green : Color.Red)
          .fontWeight(600)
      }

      Button('getNetworkStatus').onClick(() => {
   
        //用法二:获取当前的网络状态
        const status = NetworkUtil.getStatus()
        promptAction.showToast({
   
          message: 'The network status is ' + JSON.stringify(status),
          duration: 5000
        });
      })

      Button('continue When Net Usable').onClick(() => {
   
        //用法三:有网络继续后续动作,无网则中断后续动作并且弹窗提示用户设置网络。
        NetworkUtil.continueWhenNetUsable(() => {
   
          //当网络中断,弹窗提示用户设置网络且不执行后续动作
          //当网络可用,继续执行
          promptAction.showToast({
   
            message: 'have net, continue!',
            duration: 5000
          });
        })
      })
    }
    .height('100%')
    .width('100%')
  }
}
目录
相关文章
|
4月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
3月前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
312 0
|
4月前
|
安全 API 开发工具
【HarmonyOS NEXT】一键扫码功能
这些Kit为我们应用开发提升了极大地效率。很多简单的功能,如果不需要太深的定制化需求,直接调用kit提供的API就可以实现,在android或者ios上需要很多代码才能实现的功能效果。
119 0
HarmonyOS NEXT仓颉开发语言实战案例:电影App
周末好!本文分享使用仓颉语言重构ArkTS实现的电影App案例,对比两者在UI布局、组件写法及语法差异。内容包括页面结构、列表分组、分类切换与电影展示等。通过代码演示仓颉在HarmonyOS开发中的应用。##仓颉##ArkTS##HarmonyOS开发
|
4月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:健身App
本期分享一个健身App首页的布局实现,顶部采用Stack容器实现重叠背景与偏移效果,列表部分使用List结合Scroll实现可滚动内容。代码结构清晰,适合学习HarmonyOS布局技巧。
HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
本文分享了一个旅行App首页的设计与实现,使用List容器搭配Row、Column布局完成个人信息、功能列表及推荐模块的排版,详细展示了HarmonyOS下的界面构建技巧。
|
18天前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
90 0
|
18天前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
178 0
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
18天前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
50 0
|
18天前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
150 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例