openharmony 鸿蒙 global-configuration-guide

2025-06-06 浏览 (1)

Global Configuration

In cases where a process-wide singleton is necessary, for example, for maintaining data consistency across multiple concurrent instances for global configuration services, a shared module can be used.

The following example illustrates the service logic where downloads are permitted only when Wi-Fi is enabled and the user is logged in. The implementation involves the following steps:

  1. Create a global configuration file.

    // Config.ets
    
    import { ArkTSUtils } from '@kit.ArkTS';
    
    "use shared"
    
    @Sendable
    class Config {
      lock: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock
      isLogin: boolean = false;
      loginUser?: string;
      wifiOn: boolean = false
    
      async login(user: string) {
        return this.lock.lockAsync(() => {
          this.isLogin = true;
          this.loginUser = user
        }, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE)
      }
    
      async logout(user?: string) {
        return this.lock.lockAsync(() => {
          this.isLogin = false
          this.loginUser = ""
        }, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE)
      }
    
      async getIsLogin(): Promise<boolean> {
        return this.lock.lockAsync(() => {
          return this.isLogin
        }, ArkTSUtils.locks.AsyncLockMode.SHARED)
      }
    
      async getUser(): Promise<string> {
        return this.lock.lockAsync(() => {
          return this.loginUser!
        }, ArkTSUtils.locks.AsyncLockMode.SHARED)
      }
    
      async setWifiState(state: boolean) {
        return this.lock.lockAsync(() => {
          this.wifiOn = state
        }, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE)
      }
    
      async isWifiOn() {
        return this.lock.lockAsync(() => {
          return this.wifiOn;
        }, ArkTSUtils.locks.AsyncLockMode.SHARED)
      }
    }
    
    export let config = new Config()
    
  2. Enable both the UI main thread and child threads to access the global configuration.

    import { config } from './Config'
    import { taskpool } from '@kit.ArkTS';
    
    @Concurrent
    async function download() {
      if (!await config.isWifiOn()) {
        console.info("wifi is off")
        return false;
      }
      if (!await config.getIsLogin()) {
        console.info("not login")
        return false;
      }
      console.info(`User[${await config.getUser()}] start download ...`)
      return true;
    }
    
    @Entry
    @Component
    struct Index {
      @State message: string = 'not login';
      @State wifiState: string = "wifi off";
      @State downloadResult: string = "";
      input: string = ""
    
      build() {
        Row() {
          Column() {
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
            TextInput({ placeholder: "Enter user name" })
              .fontSize(20)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
              .onChange((value) => {
                this.input = value;
              })
            Text("login")
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
              .onClick(async () => {
                if (!await config.getIsLogin() && this.input) {
                  this.message = "login: " + this.input
                  config.login(this.input)
                }
              })
              .backgroundColor(0xcccccc)
            Text("logout")
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
              .onClick(async () => {
                if (await config.getIsLogin()) {
                  this.message = "not login"
                  config.logout()
                }
              })
              .backgroundColor(0xcccccc)
            Text(this.wifiState)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
            Toggle({ type: ToggleType.Switch })
              .onChange(async (isOn: boolean) => {
                await config.setWifiState(isOn)
                this.wifiState = isOn ? "wifi on" : "wifi off";
              })
            Text("download")
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
              .onClick(async () => {
                let ret = await taskpool.execute(download)
                this.downloadResult = ret ? "download success" : "download fail";
              })
            Text(this.downloadResult)
              .fontSize(20)
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    

你可能感兴趣的鸿蒙文章

harmony 鸿蒙ArkTS

harmony 鸿蒙Configuring arkOptions in build-profile.json5

harmony 鸿蒙Asynchronous Lock

harmony 鸿蒙Ark Bytecode File Format

harmony 鸿蒙Naming Conventions for Ark Bytecode Functions

harmony 鸿蒙Ark Bytecode Fundamentals

harmony 鸿蒙Overview of Ark Bytecode

harmony 鸿蒙Shared Container

harmony 鸿蒙Asynchronous Waiting

harmony 鸿蒙ArkTS Cross-Language Interaction

  • 所属分类: 后端技术
  • 本文标签: 软件 鸿蒙
  • 版权声明: 本文链接 https://seaxiang.com/blog/68SvHI