harmony 鸿蒙全局配置项功能场景

  • 2025-06-12
  • 浏览 (4)

全局配置项功能场景

对于需要使用进程单例的场景,例如不同并发实例间需要数据保持一致的全局配置项业务,可以采用共享模块来实现。

以下示例展示了只有在Wi-Fi打开且用户登录的情况下才能进行下载的业务功能,具体步骤如下。

  1. 编写全局配置文件。
   // 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()

  1. UI主线程及子线程访问全局配置项。
   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: "请输入用户名" })
             .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 鸿蒙在build-profile.json5中配置arkOptions

harmony 鸿蒙异步锁

harmony 鸿蒙方舟字节码文件格式

harmony 鸿蒙方舟字节码函数命名规则

harmony 鸿蒙方舟字节码基本原理

harmony 鸿蒙方舟字节码概述

harmony 鸿蒙共享容器

harmony 鸿蒙异步等待

harmony 鸿蒙ArkTS跨语言交互

0  赞