在HarmonyOS应用开发中,监听网络状态的变化对于提升用户体验和应用稳定性至关重要。通过及时了解网络的连接类型、信号强度、是否可用等信息,应用可以做出相应的调整,例如在网络不佳时提示用户或者切换到离线模式。本文将介绍如何在HarmonyOS中实现网络状态监听功能。

一、实现网络状态监听

1. 开始网络监听
public startNetObserve(...netType: connection.NetBearType[]) {
  netType.forEach((type: connection.NetBearType) => {
    this.networkObserve(type);
    if (type === connection.NetBearType.BEARER_WIFI) {
      this.wifiStateObserve();
    }
  })
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

在开始网络监听时,我们可以通过startNetObserve方法指定要监听的网络类型。该方法接受可变数量的NetBearType参数,表示不同的网络承载类型,如Wi-Fi、移动数据等。对于每种网络类型,我们调用networkObserve方法进行具体的监听设置。如果监听的网络类型是Wi-Fi,还会额外调用wifiStateObserve方法来监听Wi-Fi相关的状态变化。

2. 停止网络监听
public stopNetObserve(netType: connection.NetBearType) {
  this.connectionMap.get(netType).unregister(() => {
    logger.info("Success unregister:" + netType.toString());
  })
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

当需要停止对某种网络类型的监听时,可以使用stopNetObserve方法。该方法通过网络类型找到对应的NetConnection对象,并调用其unregister方法来取消注册,从而停止监听该网络类型的相关事件。

3. 网络监听核心逻辑
networkObserve(netType: connection.NetBearType) {
  let netConnection: connection.NetConnection = connection.createNetConnection({
    netCapabilities: {
      bearerTypes: [netType]
    }
  })
  netConnection.register((error: BusinessError) => {
    let result = true;
    if (error) {
      logger.info("NetUtils", "NetType :" + netType + ", network register failed: " + JSON.stringify(error));
      result = false;
    }
    logger.info("NetUtils", "NetType :" + netType + ", network register succeed");
    this.postEvent(NetworkEventName.NetObserverRegister, result, netType);
  });

  netConnection.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
    logger.info("NetUtils", "NetType :" + netType + ", network netCapabilitiesChange: " + JSON.stringify(data));
    this.postEvent(NetworkEventName.NetCapabilitiesChange, data, netType);
  })

  netConnection.on("netAvailable", (data: connection.NetHandle) => {
    logger.info("NetUtils", "NetType :" + netType + ", network succeeded to get netAvailable: " + JSON.stringify(data));
    this.postEvent(NetworkEventName.NetAvailable, connection.hasDefaultNetSync(), netType);
  });

  netConnection.on('netBlockStatusChange', (data: connection.NetBlockStatusInfo) => {
    logger.info("NetUtils", "NetType :" + netType + ", network netBlockStatusChange " + JSON.stringify(data));
    this.postEvent(NetworkEventName.NetBlock, data, netType)
  });

  netConnection.on('netConnectionPropertiesChange', (data: connection.NetConnectionPropertyInfo) => {
    logger.info("NetUtils", "NetType :" + netType + ", network netConnectionPropertiesChange " + JSON.stringify(data));
    this.postEvent(NetworkEventName.NetConnectionPropertiesChange, data, netType);
  });

  netConnection.on('netLost', (data: connection.NetHandle) => {
    this.postEvent(NetworkEventName.NetLost, true, netType)
    logger.info("NetUtils", "NetType :" + netType + ", Succeeded to get netLost: " + JSON.stringify(data));
  });

  netConnection.on('netUnavailable', () => {
    logger.info("NetUtils", "NetType :" + netType + ", Succeeded to get unavailable net event");
    this.postEvent(NetworkEventName.NetUnavailable, true, netType);
  });

  this.connectionMap.set(netType, netConnection);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

networkObserve方法是网络监听的核心实现。它首先创建一个NetConnection对象,并根据传入的网络类型设置网络能力。然后,注册该网络连接并监听多种网络事件,包括网络能力变化、网络可用、网络阻塞状态变化、网络连接属性变化、网络丢失和网络不可用等。对于每个事件,都定义了相应的回调函数,在回调中记录日志并调用postEvent方法来分发事件,以便其他模块可以接收到网络状态的变化通知。

4. 事件分发
private postEvent(eventName: NetworkEventName, status: NetworkData, netType?: connection.NetBearType,
  priority?: emitter.EventPriority) {
  this.emitterEvent.priority = priority;
  emitter.emit(this.emitterEvent, {
    data: new NetEventData(eventName, status, netType)
  })
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

postEvent方法用于将网络状态变化事件分发出去。它接受事件名称、状态数据、网络类型和优先级作为参数。通过设置事件的优先级,并使用emitter.emit方法触发事件,将包含网络状态信息的NetEventData对象作为事件数据传递给订阅了该事件的监听者。这样,其他模块就可以根据接收到的事件来执行相应的逻辑,例如更新UI或调整应用行为。

二、总结

在网络应用中,实时监听网络状态的变化对于提供良好的用户体验和确保应用的稳定性至关重要。通过上述代码案例,我们展示了如何在HarmonyOS中实现网络状态监听功能,包括开始和停止网络监听、核心的网络事件监听逻辑以及事件的分发机制。开发者可以根据实际需求,进一步扩展和定制网络状态监听的功能,例如添加更多的网络类型、处理特定的网络事件或与其他模块进行更深入的集成。