为 App 增加清理缓存功能

为 App 增加清理缓存功能

不废话,直接上干货

功能预期

  1. 评估缓存情况,估算出缓存大小;
  2. 一键清除所有缓存

评估缓存大小

已知 app 的缓存目录可通过 context.getCacheDir() 获取,那么评估其内容文件的大小即可,若有其他缓存路径也可通过此方法合并计算:

ini 复制代码
public long getFolderSize(File folder) {
    long length = 0;
    File[] files = folder.listFiles();
    
    if (files != null) {
        for (File file : files) {
            if (file.isFile()) {
                length += file.length();
            } else {
                length += getFolderSize(file);
            }
        }
    }
    return length;
}

执行方法:

scss 复制代码
// 新建异步线程防止卡顿
new Thread() {
    @Override
    public void run() {
        super.run();
        long cacheSize = getFolderSize(getCacheDir());
    }
}.start();

接下来需要将缓存大小按照合理的格式显示到界面上,我按照自己的需求小于 1MB 时显示 KB 单位,小于 1KB 时显示 0 KB,使用以下方法即可完成缓存大小的文本组织:

arduino 复制代码
public String formatSize(long size) {
    if (size >= 1024 * 1024) {
        return (size / (1024 * 1024)) + " MB";
    } else if (size >= 1024) {
        return (size / 1024) + " KB";
    } else {
        return "0 KB";
    }
}

清理各单位缓存

WebView 的缓存清理

对于 WebView 可以直接使用 webView.clearCache(true) 方法来进行清理,但清除缓存的界面没有 WebView 实例,因此需要现场先建立一个来执行,注意 WebView 的创建不可以在异步线程进行:

ini 复制代码
WebView webView = new WebView(me);
webView.clearCache(true);

Glide 的缓存清理

只需要注意 Glide 的缓存清理必须在异步线程执行

scss 复制代码
try {
    // Glide: You must call this method on a background thread
    Glide.get(me).clearDiskCache();
  } catch (Exception e) {
    e.printStackTrace();
}

其他组件请自行按照对应技术文档进行清理

综合缓存文件清理

所有缓存文件删除即可彻底完成清理步骤

ini 复制代码
File cacheDir = context.getCacheDir();
deleteDirectory(cacheDir);

删除目录方法:

scss 复制代码
private static void deleteDirectory(File dir) {
    if (dir != null && dir.isDirectory()) {
        for (File child : dir.listFiles()) {
            // 递归删除目录中的内容
            deleteDirectory(child);
        }
    }
    if (dir != null) {
        dir.delete();
    }
}

总结

其实清理缓存是个挺没必要的工作,Glide 等组件进行缓存的主要目的也在于避免重复资源的加载加快 app 的界面呈现速度,但不可避免的可能因为用户需要或者出现缓存 bug 导致界面无法正常显示等情况需要清理 app 缓存,即便系统本身自带了缓存清理功能(应用设置- app - 存储和缓存 - 清除缓存)但毕竟有些上手门槛且各家厂商操作系统操作逻辑各异不如自己做一个清除功能在 app 内了,通过上述代码即可完成缓存大小估算和清理流程,如有其他常用组件的清理操作方法也欢迎在评论区补充。

相关推荐
金銀銅鐵2 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工2 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop2 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x3 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
吹什么轩3 小时前
MySQL:数据类型
android·adb
酷炫码神3 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
驭渊的小故事3 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客3 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1884 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
造火箭4 小时前
安卓不同类型自动化测试介绍
android