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

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

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