Android 清除缓存详细实现(显示缓存大小)

简介: Android 清除缓存详细实现(显示缓存大小)

清除缓存功能算是个十分鸡肋的功能了,但是大多数产品或者客户都希望有这么个东西显得APP功能完善,网上有很多,但是对于新手来说,那些感觉并不详细,我贴个完整到小白都能懂的。

下面是工具类,包含清除缓存、获取缓存文件大小、格式化方法。

总之就是工具,自己创建一个帖进去。

public class CacheDataManager {undefined

public static String getTotalCacheSize(Context context) throws Exception {undefined

long cacheSize = getFolderSize(context.getCacheDir());

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {undefined

cacheSize += getFolderSize(context.getExternalCacheDir());

}

return getFormatSize(cacheSize);

}

public static void clearAllCache(Context context) {undefined

deleteDir(context.getCacheDir());

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {undefined

deleteDir(context.getExternalCacheDir());

}

}

private static boolean deleteDir(File dir) {undefined

if (dir != null && dir.isDirectory()) {undefined

String[] children = dir.list();

for (int i = 0; i < children.length; i++) {undefined

boolean success = deleteDir(new File(dir, children[i]));

if (!success) {undefined

return false;

}

}

}

return dir.delete();

}

// 获取文件

// Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/

// 目录,一般放一些长时间保存的数据

// Context.getExternalCacheDir() -->

// SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

public static long getFolderSize(File file) throws Exception {undefined

long size = 0;

try {undefined

File[] fileList = file.listFiles();

for (int i = 0; i < fileList.length; i++) {undefined

// 如果下面还有文件

if (fileList[i].isDirectory()) {undefined

size = size + getFolderSize(fileList[i]);

} else {undefined

size = size + fileList[i].length();

}

}

} catch (Exception e) {undefined

e.printStackTrace();

}

return size;

}

/**

* 格式化单位

*

* @param size

*/

public static String getFormatSize(double size) {undefined

double kiloByte = size / 1024;

if (kiloByte < 1) {undefined

return size + "Byte";

}

double megaByte = kiloByte / 1024;

if (megaByte < 1) {undefined

BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));

return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";

}

double gigaByte = megaByte / 1024;

if (gigaByte < 1) {undefined

BigDecimal result2 = new BigDecimal(Double.toString(megaByte));

return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";

}

double teraBytes = gigaByte / 1024;

if (teraBytes < 1) {undefined

BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));

return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";

}

BigDecimal result4 = new BigDecimal(teraBytes);

return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";

}

}

在你要显示的TextView上显示清理前的缓存大小,在Activity的onCreate()方法中直接设置就好了,其实就是调用了上面工具类的getTotalCacheSize()方法,有异常,需要捕获。

try {undefined

txtCacheSize.setText(CacheDataManager.getTotalCacheSize(this));

} catch (Exception e) {undefined

e.printStackTrace();

}

再创建一个内部类,用于清理内存,实现了一个Runnable,清理完后发一个消息,这里可以灵活一点。

class clearCache implements Runnable {

@Override

public void run() {undefined

try {undefined

CacheDataManager.clearAllCache(SettingsActivity.this);

Thread.sleep(3000);

if (CacheDataManager.getTotalCacheSize(SettingsActivity.this).startsWith("0")) {undefined

handler.sendEmptyMessage(0);

}

} catch (Exception e) {undefined

return;

}

}

}

创建一个Handle接收消息,处理结果,其实用意是清理完了就弹一个吐司,清理完成,就是这样,也可以创建一个dialog,开始清理的时候显示,在下面方法关闭,然后再设置一遍TextView,就是下面这样。

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {undefined

switch (msg.what) {undefined

case 0:

Toast.makeText(SettingActivity.this,"清理完成",Toast.LENGTH_SHORT).show();

try {undefined

txtCacheSize.setText(CacheDataManager.getTotalCacheSize(SettingsActivity.this));

} catch (Exception e) {undefined

e.printStackTrace();

}

}

};

};

相关文章
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
缓存 Android开发
Android Studio中如何清理gradle缓存
Android Studio中如何清理gradle缓存
|
4月前
|
XML 缓存 Java
Android App开发之利用Glide实现图片的三级缓存Cache讲解及实战(附源码 超详细必看 简单易懂)
Android App开发之利用Glide实现图片的三级缓存Cache讲解及实战(附源码 超详细必看 简单易懂)
120 0
|
9月前
|
缓存
thinkphp5.0清除缓存、模版缓存和日志缓存的方法
thinkphp5.0清除缓存、模版缓存和日志缓存的方法
64 0
|
11月前
|
缓存 NoSQL 测试技术
实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发
实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发
77 0
|
12月前
|
缓存 Java Android开发
Android C++ 系列:JNI 调用时缓存字段和方法 ID
通常我们通过 FindClass 、GetFieldID、GetMethodID 去找到对应的信息也是耗时操作,如果方法被频繁调用(特别是像音视频处理时循环的调用JNI方法传递音视频数据),每次都去查找对应的类和方法ID会很耗性能,所以我们必须将它们缓存起来,达到只创建一次,后面直接使用缓存内容的效果。
93 0
|
缓存 Java Android开发
Android使用LruCache、DiskLruCache实现图片缓存+图片瀑布流
**本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如[glide]
130 0
|
存储 缓存 Java
Android使用磁盘缓存DiskLruCache
不同于LruCache,LruCache是将数据缓存到内存中去,而DiskLruCache是外部缓存,例如可以将网络下载的图片永久的缓存到手机外部存储中去,并可以将缓存数据取出来使用,DiskLruCache不是google官方所写,但是得到了官方推荐
144 0
|
存储 缓存 算法
Android内存缓存LruCache源码解析
内存缓存,使用强引用方式缓存有限个数据,当缓存的某个数据被访问时,它就会被移动到队列的头部,当一个新数据要添加到LruCache而此时缓存大小要满时,队尾的数据就有可能会被垃圾回收器(GC)回收掉,LruCache使用的LRU(Least Recently Used)算法,即:<strong>把最近最少使用的数据从队列中移除,把内存分配给最新进入的数据。</strong>
|
缓存 PHP
在Yii2.0框架中,可以使用yii\caching\TagDependency类来实现对缓存的依赖管理,这个类可以在缓存失效时自动清除缓存。使用前需要先use吗?
在Yii2.0框架中,可以使用yii\caching\TagDependency类来实现对缓存的依赖管理,这个类可以在缓存失效时自动清除缓存。使用前需要先use吗?