前言
年前公司與華為簽訂了合作備忘錄,加入了鴻蒙生態(tài)這個(gè)大家庭。。公司想趕著鴻蒙純血系統(tǒng)上市之前,發(fā)布自己的鴻蒙軟件。開發(fā)鴻蒙NEXT版本軟件就變成了今年的一個(gè)工作重心。
** 本文主要講解開發(fā)過程中遇到的并發(fā)問題,官方API 11文檔寫的太簡(jiǎn)單了,根本沒有解決方案,小編也是苦思冥想,絞盡腦汁才找到解決方案。需要開發(fā)鴻蒙的小伙伴可以仔細(xì)閱讀,避免踩坑。**
問題
在開發(fā)清除緩存的功能時(shí),鴻蒙NEXT提供的文檔中說(shuō)明,應(yīng)用緩存文件有四個(gè),需要清除指定的四個(gè)緩存文件夾。如圖所示:

清除緩存代碼如下:
import fs from '@ohos.file.fs'
fs.access("文件路徑").then((isHas:boolean) = > {
if(isHas) { //判斷文件是否存在
fs.rmdirSync("文件路徑")//刪除文件
}
})
需要同時(shí)清除這四個(gè)文件夾,然后再計(jì)算這四個(gè)文件夾的大小。由于fs.access 方法是耗時(shí)操作。所以只能在異步線程中執(zhí)行。
解決方案
一般思路
鴻蒙官方文檔API 11 提供了使用Promise和async/await處理異步并發(fā)問題。

注意是單次I/O任務(wù),可問題是我們需要解決同時(shí)并發(fā)問題,一次拿到四次清除緩存結(jié)果再去統(tǒng)計(jì)緩存大小。這個(gè)時(shí)候可能有的小伙伴就會(huì)說(shuō),那就先清除第一個(gè),等一個(gè)結(jié)果返回再清除第二個(gè),以此類推。也能解決問題。如下圖所示:
fs.access("文件路徑1").then((isHas:boolean) = > {
if(isHas) { //判斷文件是否存在
fs.rmdirSync("文件路徑1")//刪除文件
fs.access("文件路徑2").then((isHas:boolean) = > {
if(isHas) { //判斷文件是否存在
fs.rmdirSync("文件路徑2")//刪除文件
.....................
}
})
}
})
但是這樣就會(huì)帶來(lái)兩個(gè)問題:多層嵌套與代碼混亂。在Flutter中這個(gè)問題非常好解決。這里就不詳細(xì)描述了。
優(yōu)雅方案
使用Promise.all 解決。小編在官方文檔中并沒有找到Promise.all 相關(guān)說(shuō)明,可能是鴻蒙還沒注意到這種需求場(chǎng)景吧。直接上代碼。
- 先將文件清除包裝成一個(gè)異步任務(wù)。
asyncClear(dir: string): Promise< void > {
return new Promise((resolve, reject) = > {
fs.access(dir).then((isHas: boolean) = > {
if (isHas) {
fs.rmdir(dir)
}
resolve()
})
})
}
- 將四個(gè)緩存文件夾對(duì)應(yīng)的任務(wù)放在一個(gè)數(shù)組中。
let promises = [
this.asyncClear("文件夾1"),
this.asyncClear("文件夾2"),
this.asyncClear("文件夾3"),
this.asyncClear("文件夾4")
]
- 將任務(wù)數(shù)組放進(jìn)Promis.all中,等待四個(gè)任務(wù)執(zhí)行結(jié)束。
Promise.all(promises).then(() = > {
// 結(jié)束回調(diào)
})
- 在結(jié)束回調(diào)中 再去調(diào)用計(jì)算緩存大小的方法。
storageStatistics.getCurrentBundleStats().then((bundleStats) = > {
let cacheSizeNum = bundleStats.cacheSize
let unit = "KB"
if (cacheSizeNum > 1024) {
cacheSizeNum = Math.floor(cacheSizeNum) / 1024
unit = "KB"
}
if (cacheSizeNum > 1024) {
cacheSizeNum = Math.floor(cacheSizeNum) / 1024
unit = "MB"
}
if (cacheSizeNum > 1024) {
cacheSizeNum = Math.floor(cacheSizeNum) / 1024
unit = "GB"
}
if (cacheSizeNum > 1024) {
cacheSizeNum = Math.floor(cacheSizeNum) / 1024
unit = "TB"
}
let chacheSizeString = "" + Math.floor(cacheSizeNum) + unit
});
總結(jié)
鴻蒙NEXT的API還不算完善,需要每個(gè)開發(fā)者的參與,發(fā)現(xiàn)問題,提出問題,鴻蒙開發(fā)人員才能更好的解決問題。如果您也是鴻蒙開發(fā)者,有其他更好的解決方案,歡迎評(píng)論區(qū)交流 ,互相學(xué)習(xí),互相成長(zhǎng)!
審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
60文章
2963瀏覽量
45920 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2153瀏覽量
36071
發(fā)布評(píng)論請(qǐng)先 登錄
Go 語(yǔ)言高并發(fā)服務(wù)設(shè)計(jì)與性能調(diào)優(yōu)實(shí)戰(zhàn):從萬(wàn)級(jí)到百萬(wàn)級(jí)并發(fā)的演進(jìn)之路
如何在單個(gè)圖表上繪制多個(gè)測(cè)量結(jié)果曲線
一文說(shuō)透了如何實(shí)現(xiàn)單片機(jī)的多任務(wù)并發(fā)!
智能樓宇改造避坑指南:別再換掉所有老設(shè)備!一招搞定ETHERNET/IP轉(zhuǎn)DEVICENET的共存難題
Swift 的并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)
別再卡分頁(yè)!淘寶全量商品接口實(shí)戰(zhàn)開發(fā)指南:從并發(fā)優(yōu)化到數(shù)據(jù)完整性閉環(huán)
AppGallery Connect(HarmonyOS 5及以上) --公開測(cè)試創(chuàng)建并發(fā)布測(cè)試版本(三)
AppGallery Connect(HarmonyOS 5及以上) --公開測(cè)試創(chuàng)建并發(fā)布測(cè)試版本(一)
創(chuàng)建并發(fā)布測(cè)試版本(一)
工業(yè)電路總出問題?檳城BMG10D系列壓敏復(fù)合器件:一招解決過壓難題
一招解決多地區(qū)無(wú)感考勤的問題
HarmonyOS實(shí)戰(zhàn):一招搞定保存圖片到相冊(cè)
鴻蒙5開發(fā)寶藏案例分享---應(yīng)用并發(fā)設(shè)計(jì)
HarmonyOS實(shí)戰(zhàn):組件化項(xiàng)目搭建
HarmonyOS實(shí)戰(zhàn):一招解決等待多個(gè)并發(fā)結(jié)果
評(píng)論