💬

HarmonyOS開発実践:API 11に基づくネットワーク管理のノウハウと実践アプリケーションの詳細解説

に公開

概要

HarmonyOSプロジェクト開発において、ネットワーク管理は非常に重要な役割を果たします。本稿では、API 11に基づいて、HarmonyOSネットワーク管理のコア技術を深く分析し、開発者がネットワーク状態を正確に把握し、スムーズでユーザーにやさしいアプリケーション エクスペリエンスを提供するのを支援します。

HarmonyOSアプリケーションでは、リアルタイムでネットワーク状態を監視することは、アプリケーションの安定性とユーザー エクスペリエンスを確保する鍵です。ネットワーク状態の変化、例えばWi - Fiからモバイルデータへの切り替え、またはネットワーク状態からネットワークなし状態への変化などは、アプリケーションが対応する必要があります。例えば、アプリケーションは進行中の操作を一時停止するか、ユーザーに通知を発行するなどして、アプリケーションが各种のネットワーク環境で安定して動作することを保証することができます。

一、リアルタイムでネットワーク状態を監視し、変化にスマートに応答する

HarmonyOSプロジェクトでは、効率的なネットワーク管理クラスを構築することは、スムーズなアプリケーション エクスペリエンスを実現するためのコア要素です。この管理クラスは、ネットワーク状態をリアルタイムで監視し、状態が変化した場合に迅速に応答することができます。次に、専門的な要件を満たすネットワーク管理クラスを設計する方法について詳しく議論します。

まず、ネットワーク接続状態が変化した場合のコールバック関数の型を定義しました。これにより、ネットワーク状態が変化した場合に柔軟に対応するための処理ロジックを実行することができます。

/**
 * ネットワーク接続状態の変化のコールバック関数の型定義
 */
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シングルトンインスタンス
   * グローバルに1つのネットワーク管理クラスインスタンスのみがあることを保証します
   */
  private static instance: LibNetworkStatus;

  /**
   * 現在のネットワーク状態
   * 現在のネットワーク接続状態を格納します
   */
  private currentNetworkStatus: NetworkType = NetworkType.STATE_NULL;

  /**
   * ネットワークが利用可能かどうか
   * 現在利用可能なネットワーク接続があるかどうかを示します
   */
  private isNetworkAvailable: boolean = false;

  /**
   * HarmonyOSネットワーク接続オブジェクト
   * HarmonyOSシステムのネットワーク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);
  });
}

コード分析

  • コールバックメソッドの追加と削除addCallbackremoveCallback の 2 つのメソッドを定義しました。これにより、アプリケーションは実行時に動的にコールバックを追加または削除する柔軟性と拡張性が与えられます。

  • コールバックメソッドの管理Set データ構造を使用してコールバックメソッドを管理し、コールバックメソッドのユニーク性を保証し、重複した呼び出しや潜在的なメモリリークの問題を回避します。

  • 即時コールバックメカニズムaddCallback メソッドでは、isCallBackCurrentNetworkStatus オプションを提供し、コールバックを追加するときに現在のネットワーク状態をすぐにコールバックで返すことができます。これにより、現在のネットワーク状態をすぐに知る必要があるアプリケーションに便利です。

  • ステータス通知callbackNetworkStatus メソッドは、ネットワーク状態が変化した場合にすべての登録されたコールバックメソッドに通知する責任があります。Set 内の各コールバックメソッドを順番に呼び出すことで、ネットワーク状態の変化に興味があるアプリケーションのすべての部分がタイムリーに通知を受けることを保証します。

三、ネットワーク関連のコアメソッド

  1. ネットワーク状態情報を取得する

ネットワーク管理クラスを構築する際には、正確で効率的なネットワーク状態取得メソッドを提供することが非常に重要です。これらのメソッドにより、ネットワーク状況をリアルタイムで監視し、異なるネットワーク状態に応じて対応することができます。次に、これらのコアメソッドについて詳しく説明します。

/**
 * 現在のネットワークが利用可能かどうかを確認する
 *
 * @returns 現在のネットワークが利用可能かどうかを示すブール値を返します
 */
isNetworkAvailable(): boolean {
  return this.isNetworkAvailable;
}

/**
 * 現在のネットワーク状態を取得する
 *
 * @returns 現在のネットワークステータス コードを返します
 */
getCurrentNetworkStatus(): NetworkType {
  return this.currentNetworkStatus;
}
  1. 精密に検出し、現在のネットワーク タイプを取得する
/**
 * 現在のネットワーク タイプを取得する
 *
 * このメソッドは、システム 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 メソッドを使用して、ネットワーク能力情報を取得し、承载タイプのリストを含みます。
  1. モバイル ネットワーク状態の変化を監視するリスナーを登録する

まず、ネットワーク状態の変化の主要なタイプを理解する必要があります。ネットワークが利用可能から利用不可に変わる場合、ネットワークが利用不可から利用可能に変わる場合、ネットワークが Wi - Fi からモバイル データに変わる場合などです。これらの状態の変化には、アプリケーションが対応する必要があります。例えば、データを再読み込み、特定の操作を一時停止する、または現在のネットワーク状態をユーザーに通知するなどです。

/**
 * ネットワーク状態リスナーを登録する:
 * デバイスがネットワークが利用可能から利用不可に変わる場合、「netAvailable」、「netCapabilitiesChange」、「netConnectionPropertiesChange」イベントがトリガーされます。
 * デバイスがネットワークが利用不可から利用可能に変わる場合、「netLost」イベントがトリガーされます。
 * デバイスが Wi - Fi からモバイル データに変わる場合、「netLost」イベント(Wi - Fi が利用不可)がトリガーされ、次に「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()
  })
}

以上のように、HarmonyOSのネットワーク管理機能は、開発者に強力なサポートを提供し、ネットワーク状態を正確に把握し、スムーズでユーザーにやさしいアプリケーション エクスペリエンスを提供するのを助けてくれます。HarmonyOSのネットワーク管理のコア技術を深く理解することで、私たちは各种のネットワーク環境下での課題に更好地対応することができ、ユーザーにより良い使用体験を提供することができます。

Discussion