计算Android app缓存大小以及清除缓存
这是一个常用功能,记录一下
代码才是精华
object CacheUtils {
/**
* 获取缓存总大小
*
* @param context
* @return
* @throws Exception
*/
@Throws(Exception::class)
fun getTotalCacheSize(context: Context): String {
var cacheSize = getFolderSize(context.cacheDir)
if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
cacheSize += getFolderSize(context.externalCacheDir)
}
return getFormatSize(cacheSize.toDouble())
}
/**
* 清理全部缓存
*
* @param context
*/
fun clearAllCache(context: Context) {
deleteDir(context.cacheDir)
if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
deleteDir(context.externalCacheDir)
}
}
/**
* 删除文件
*
* @param dir
* @return
*/
private fun deleteDir(dir: File?): Boolean {
if (null == dir) {
return false
}
if (dir.isDirectory) {
val children = dir.list()
for (i in children.indices) {
val success = deleteDir(File(dir, children[i]))
if (!success) {
return false
}
}
}
return dir.delete()
}
// 获取文件
//Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/目录,一般放一些长时间保存的数据
//Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
@Throws(Exception::class)
fun getFolderSize(file: File?): Long {
var size: Long = 0
try {
val fileList = file!!.listFiles()
for (i in fileList.indices) {
// 如果下面还有文件夹
size += if (fileList[i].isDirectory) {
getFolderSize(fileList[i])
} else {
fileList[i].length()
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return size
}
/**
* 格式化单位
*
* @param size
* @return
*/
fun getFormatSize(size: Double): String {
val kiloByte = size / 1024
if (kiloByte < 1) {
// return size + "Byte";
return "0K"
}
val megaByte = kiloByte / 1024
if (megaByte < 1) {
val result1 = BigDecimal(java.lang.Double.toString(kiloByte))
return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "KB"
}
val gigaByte = megaByte / 1024
if (gigaByte < 1) {
val result2 = BigDecimal(java.lang.Double.toString(megaByte))
return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "MB"
}
val teraBytes = gigaByte / 1024
if (teraBytes < 1) {
val result3 = BigDecimal(java.lang.Double.toString(gigaByte))
return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "GB"
}
val result4 = BigDecimal(teraBytes)
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"
}
}
效果图如下