HarmonyOS 鸿蒙Next 如何解决APP缓存无法彻底清除问题

发布于 1周前 作者 songsunli 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何解决APP缓存无法彻底清除问题

【问题现象】

参考官网示例方法清理缓存时,无法彻底清除,导致通过storageStatistics.getCurrentBundleStats接口获取清理后应用缓存的大小,依旧不为。

【背景知识】

在应用程序中,缓存是指将特定数据存储在设备内部或外部存储器中,以便快速获取和访问。缓存的主要作用是提高应用程序和网页的加载速度,并减少对网络资源的请求。当我们打开一个应用或浏览网页时,设备会将一些数据临时存储在缓存中,以便下次访问时可以更快地加载,从而节省时间和数据流量,提升用户体验。

应用缓存:应用程序在运行过程中产生的临时数据,如照片、视频、文档等。这些缓存数据可以加快应用程序的响应速度,并提供离线使用的功能。但是当应用缓存的数据过多,会导致应用占用较大的内存空间。

【定位思路】

如果使用缓存清理接口后,调用缓存查询出的缓存数据依旧不为,这表明清理的方法没有彻底清除缓存数据。我们使用方法中提供的手段只删除了应用沙箱路径下一个文件夹中的文件/data/storage/el2/base/haps/entry/cache。实际上,缓存存在于四个文件夹中,需要清理以下四个文件夹:

  • /data/storage/el1/base/cache
  • /data/storage/el1/base/haps/entry/cache
  • /data/storage/el2/base/cache
  • /data/storage/el2/base/haps/entry/cache

【解决方案】

(1)分别获取四个文件夹的路径,彻底删除每个文件夹下的缓存数据。

代码示例如下:

let paths:Array<string> = []
let moduleContext: common.Context;
let context = getContext()
moduleContext = await application.createModuleContext(getContext(), 'entry');
console.log('111moduleContext + el2: ' + moduleContext.cacheDir); //data/storage/el2/base/cache
console.log('111UIAbilityContext + el2: ' + context.cacheDir); ///data/storage/el2/base/haps/entry/cache
paths.push(moduleContext.cacheDir)
paths.push(context.cacheDir)
moduleContext.area = contextConstant.AreaMode.EL1;
console.log('111moduleContext + el1: ' + moduleContext.cacheDir); ///data/storage/el1/base/cache
context.area = contextConstant.AreaMode.EL1;
console.log('111UIAbilityContext + el1: ' + context.cacheDir) ///data/storage/el1/base/haps/entry/cache
paths.push(moduleContext.cacheDir)
paths.push(context.cacheDir)

通过上述方法将缓存目录统计至paths数组中。

(2)遍历paths数组,删除缓存文件。

代码示例如下:

for (let i = 0; i < paths.length; i++) {
  let path = paths[i]
  fileIo.listFile(path).then((filenames) => {
    for (let i = 0; i < filenames.length; i++) {
      let dirPath = path + '/' + filenames[i];
      console.log(dirPath);
      // 判断是否为文件夹
      let isDirectory: boolean = false;
      try {
        isDirectory = fileIo.statSync(dirPath).isDirectory();
      } catch (e) {
        console.error(JSON.stringify(e));
      }

      if (isDirectory) {
        fileIo.rmdirSync(dirPath);
      } else {
        fileIo.unlink(dirPath).then(() => {
          console.info('remove file succeed');
        }).catch((err: Error) => {
          console.error('remove file failed with error message: ' + err.message);
        });
      }
    }

  })
}

实现效果如下:

1、采用示例方法仅删除

删除前:

删除后:

2、采用文本介绍的方法全部删除

删除前:

删除后:

【总结】

我们在清理缓存时,需要根据使用场景来决定删除缓存要到什么程度,由应用自己本身控制。常见缓存会存在在四个目录下面,当我们需要彻底删除时,需要遍历每一个目录进行删除。

1 回复

作为IT专家,对于HarmonyOS 鸿蒙Next中APP缓存无法彻底清除的问题,以下是一些专业解决方案:

在HarmonyOS鸿蒙Next系统中,APP缓存数据存储在特定目录下,如/data/storage/el1/base/cache等。要彻底清除这些缓存,首先需获取缓存目录路径,可以通过调用context的cacheDir属性实现。接下来,使用系统文件fs接口来判断要删除的是文件还是文件夹。针对文件,使用fs.unlink方法删除;针对文件夹,若为空可直接使用fs.rmdirSync方法删除,若文件夹非空则需先删除文件夹内的所有文件。

此外,HarmonyOS鸿蒙Next系统也提供了通过“设置”来清除APP缓存的简便方法。用户只需打开“设置”,选择“应用和服务”,进入“应用管理”,选择需要清除缓存的应用,点击“存储”,最后点击“清空缓存”即可。

值得注意的是,有时清除APP缓存后,web的缓存并未立即清除。这可能是由于缓存机制的不同步导致的。在这种情况下,可以尝试重启设备或重新打开应用,以确保缓存的彻底清除。

同时,对于涉及大量图片的应用,HarmonyOS鸿蒙Next的Image组件提供了多级缓存策略,包括内存缓存、数据缓存和物理磁盘缓存。开发者可以通过设置全局缓存来管理缓存的图片数量,从而优化应用的性能和用户体验。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部