美文网首页Android Demoandroid
Android 清除缓存详细实现(显示缓存大小)

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

作者: 0156770c53ab | 来源:发表于2017-01-06 12:28 被阅读6983次

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

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

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

public class CacheDataManager {

public static String getTotalCacheSize(Context context) throws Exception {

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

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

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

}

return getFormatSize(cacheSize);

}

public static void clearAllCache(Context context) {

deleteDir(context.getCacheDir());

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

deleteDir(context.getExternalCacheDir());

}

}

private static boolean deleteDir(File dir) {

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

String[] children = dir.list();

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

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

if (!success) {

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 {

long size = 0;

try {

File[] fileList = file.listFiles();

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

// 如果下面还有文件

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

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

} else {

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

}

}

} catch (Exception e) {

e.printStackTrace();

}

return size;

}

/**

* 格式化单位

*

* @param size

*/

public static String getFormatSize(double size) {

double kiloByte = size / 1024;

if (kiloByte < 1) {

return size + "Byte";

}

double megaByte = kiloByte / 1024;

if (megaByte < 1) {

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

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

}

double gigaByte = megaByte / 1024;

if (gigaByte < 1) {

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

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

}

double teraBytes = gigaByte / 1024;

if (teraBytes < 1) {

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 {

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

} catch (Exception e) {

e.printStackTrace();

}

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

class clearCache implements Runnable {

@Override

public void run() {

try {

CacheDataManager.clearAllCache(SettingsActivity.this);

Thread.sleep(3000);

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

handler.sendEmptyMessage(0);

}

} catch (Exception e) {

return;

}

}

}

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

private Handler handler = new Handler() {

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

switch (msg.what) {

case 0:

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

try {

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

} catch (Exception e) {

e.printStackTrace();

}

}

};

};

最后就是在设置监听的按钮中调用就好了。

newThread(newclearCache()).start();

相关文章

网友评论

  • 67da94618839:楼主这文章太棒啦,必须点赞
  • 墨池又雨:真的太棒 感谢感谢 从来没刻意登录上来 这次必须来点赞
  • 啟风了:感谢
  • 4839068c3f32:我在获取不到自己的缓存 写了个节操视频 播放好几遍没有视频 有加了个加载网络图片还是0没有任何变化 求解
    0156770c53ab:@李媛荣的一条狗 你去看看节操视频有没有相关的清除缓存的api,我也没看懂你说的什么,不过清除缓存这个功能本身很鸡肋
  • wayne777: 当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,
    否则就调用getCacheDir()方法来获取缓存路径。
    0156770c53ab:@何思超 这个方法只能清除部分缓存,像图片这种是清不了的,因为是鸡肋功能,能有效果就好了
    66557b294560:我在设置获取的应用缓存是44kb 但是在应用内清除的时候只有5kb 请问如何解决:relaxed:
    0156770c53ab: @WeiYang_02c8 多谢!

本文标题:Android 清除缓存详细实现(显示缓存大小)

本文链接:https://www.haomeiwen.com/subject/ingkdttx.html