文档管理中心
我的
|

HarmonyOS 5

如何解决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
分享
举报
浏览814 编辑于2024-11-21 13:29广东
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。