全局配置项功能场景
对于需要使用进程单例的场景,例如不同并发实例间需要数据保持一致的全局配置项功能,可以采用共享模块来实现。
以下示例展示了只有在Wi-Fi打开且用户登录的情况下才能进行下载的功能,具体步骤如下。
-
编写全局配置文件。
import { ArkTSUtils } from '@kit.ArkTS';'use shared'@Sendableclass Config {public lock: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock;public isLogin: boolean = false;public loginUser?: string;public 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(); -
UI主线程及子线程访问全局配置项。
import { config } from './Config';import { taskpool } from '@kit.ArkTS';@Concurrentasync 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@Componentstruct 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: '请输入用户名' }).id('textInput').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;try {config.login(this.input);} catch (e) {console.info('login failed');}}}).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';try {config.logout();} catch (e) {console.info('logout failed');}}}).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%')}}