1# Global Configuration Items 2 3In scenarios where a single process instance is required, for example, global configuration item services that require data consistency between different concurrent instances, the shared module can be used. 4 5The following example implements the service function that can be downloaded only after Wi-Fi is enabled and users log in to the system. The procedure is as follows: 6 71. Compile the global configuration file. 8 9 ```ts 10 // Config.ets 11 12 import { ArkTSUtils } from '@kit.ArkTS'; 13 14 "use shared" 15 16 @Sendable 17 class Config { 18 lock: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock 19 isLogin: boolean = false; 20 loginUser?: string; 21 wifiOn: boolean = false 22 23 async login(user: string) { 24 return this.lock.lockAsync(() => { 25 this.isLogin = true; 26 this.loginUser = user 27 }, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE) 28 } 29 30 async logout(user?: string) { 31 return this.lock.lockAsync(() => { 32 this.isLogin = false 33 this.loginUser = "" 34 }, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE) 35 } 36 37 async getIsLogin(): Promise<boolean> { 38 return this.lock.lockAsync(() => { 39 return this.isLogin 40 }, ArkTSUtils.locks.AsyncLockMode.SHARED) 41 } 42 43 async getUser(): Promise<string> { 44 return this.lock.lockAsync(() => { 45 return this.loginUser! 46 }, ArkTSUtils.locks.AsyncLockMode.SHARED) 47 } 48 49 async setWifiState(state: boolean) { 50 return this.lock.lockAsync(() => { 51 this.wifiOn = state 52 }, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE) 53 } 54 55 async isWifiOn() { 56 return this.lock.lockAsync(() => { 57 return this.wifiOn; 58 }, ArkTSUtils.locks.AsyncLockMode.SHARED) 59 } 60 } 61 62 export let config = new Config() 63 ``` 64 652. The UI main thread and subthreads access global configuration items. 66 67 ```ts 68 import { config } from './Config' 69 import { taskpool } from '@kit.ArkTS'; 70 71 @Concurrent 72 async function download() { 73 if (!await config.isWifiOn()) { 74 console.info("wifi is off") 75 return false; 76 } 77 if (!await config.getIsLogin()) { 78 console.info("not login") 79 return false; 80 } 81 console.info(`User[${await config.getUser()}] start download ...`) 82 return true; 83 } 84 85 @Entry 86 @Component 87 struct Index { 88 @State message: string = 'not login'; 89 @State wifiState: string = "wifi off"; 90 @State downloadResult: string = ""; 91 input: string = "" 92 93 build() { 94 Row() { 95 Column() { 96 Text(this.message) 97 .fontSize(50) 98 .fontWeight(FontWeight.Bold) 99 .alignRules({ 100 center: { anchor: '__container__', align: VerticalAlign.Center }, 101 middle: { anchor: '__container__', align: HorizontalAlign.Center } 102 }) 103 TextInput ({placeholder: "Please enter a user name."}) 104 .fontSize(20) 105 .fontWeight(FontWeight.Bold) 106 .alignRules({ 107 center: { anchor: '__container__', align: VerticalAlign.Center }, 108 middle: { anchor: '__container__', align: HorizontalAlign.Center } 109 }) 110 .onChange((value) => { 111 this.input = value; 112 }) 113 Text("login") 114 .fontSize(50) 115 .fontWeight(FontWeight.Bold) 116 .alignRules({ 117 center: { anchor: '__container__', align: VerticalAlign.Center }, 118 middle: { anchor: '__container__', align: HorizontalAlign.Center } 119 }) 120 .onClick(async () => { 121 if (!await config.getIsLogin() && this.input) { 122 this.message = "login: " + this.input 123 config.login(this.input) 124 } 125 }) 126 .backgroundColor(0xcccccc) 127 Text("logout") 128 .fontSize(50) 129 .fontWeight(FontWeight.Bold) 130 .alignRules({ 131 center: { anchor: '__container__', align: VerticalAlign.Center }, 132 middle: { anchor: '__container__', align: HorizontalAlign.Center } 133 }) 134 .onClick(async () => { 135 if (await config.getIsLogin()) { 136 this.message = "not login" 137 config.logout() 138 } 139 }) 140 .backgroundColor(0xcccccc) 141 Text(this.wifiState) 142 .fontSize(50) 143 .fontWeight(FontWeight.Bold) 144 .alignRules({ 145 center: { anchor: '__container__', align: VerticalAlign.Center }, 146 middle: { anchor: '__container__', align: HorizontalAlign.Center } 147 }) 148 Toggle({ type: ToggleType.Switch }) 149 .onChange(async (isOn: boolean) => { 150 await config.setWifiState(isOn) 151 this.wifiState = isOn ? "wifi on" : "wifi off"; 152 }) 153 Text("download") 154 .fontSize(50) 155 .fontWeight(FontWeight.Bold) 156 .alignRules({ 157 center: { anchor: '__container__', align: VerticalAlign.Center }, 158 middle: { anchor: '__container__', align: HorizontalAlign.Center } 159 }) 160 .onClick(async () => { 161 let ret = await taskpool.execute(download) 162 this.downloadResult = ret ? "download success" : "download fail"; 163 }) 164 Text(this.downloadResult) 165 .fontSize(20) 166 .fontWeight(FontWeight.Bold) 167 .alignRules({ 168 center: { anchor: '__container__', align: VerticalAlign.Center }, 169 middle: { anchor: '__container__', align: HorizontalAlign.Center } 170 }) 171 } 172 .width('100%') 173 } 174 .height('100%') 175 } 176 } 177 ``` 178