为 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 分钟前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
恋猫de小郭5 分钟前
Flutter 在 Android 出现随机字体裁剪?其实是图层合并时的边界计算问题
android·flutter·ios
毕设源码-邱学长11 分钟前
【开题答辩全过程】以 基于Springboot的酒店住宿信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
2501_9159184127 分钟前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview
仟濹38 分钟前
【Java加强】1 异常 | 打卡day1
java·开发语言·python
AllData公司负责人1 小时前
【亲测好用】实时开发平台能力演示
java·c语言·数据库
pcm1235671 小时前
设计C/S架构的IM通信软件(3)
java·c语言·架构
咖啡啡不加糖1 小时前
Grafana 监控服务指标使用指南:打造可视化监控体系
java·后端·grafana
€8111 小时前
Java入门级教程26——序列化和反序列化,Redis存储Java对象、查询数据库与实现多消费者消息队列
java·拦截器·序列化和反序列化·数据库查询·redis存储java对象·多消费者消息队列
多多*1 小时前
Mysql数据库相关 事务 MVCC与锁的爱恨情仇 锁的层次架构 InnoDB锁分析
java·数据库·windows·sql·oracle·面试·哈希算法