Android 程序常用功能《清除缓存》
本文使用kotlin加协程完成app的缓存清理功能
CacheDataManager 本地存储工具类
object CacheDataManager {
/**
* 获取缓存大小
*/
fun getLocalCachesSize(context: Context): String {
try {
var cacheSize: Long = getFolderSize(context.cacheDir)
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
context.externalCacheDir?.let { cacheSize += getFolderSize(it) }
}
return getFormatSize(cacheSize.toDouble())
} catch (e: Exception) {
throw e
}
}
/**
* 清除文件
*/
fun clearAllCache(context: Context) {
deleteDir(context.cacheDir)
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
context.externalCacheDir?.let { deleteDir(it) }
}
}
/**
* 删除文件
*/
fun deleteDir(dir: File): Boolean {
if (dir != null && dir.isDirectory) {
var children = dir.list()
children.forEach {
var success: Boolean = deleteDir(File(dir, it))
if (!success) {
return false
}
}
}
return dir.delete()
}
/**
* 获取文件的大小
*/
private fun getFolderSize(file: File): Long {
var size: Long = 0
try {
var listFiles = file.listFiles()
listFiles.forEach {
//如果下面还有文件
if (it.isDirectory) {
size += getFolderSize(it)
} else {
size += it.length()
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return size
}
/**
* 格式化单位
*/
fun getFormatSize(size: Double): String {
val kiloByte: Double = size / 1024
if (kiloByte < 1) {
return "${size}Byte"
}
val megaByte: Double = kiloByte / 1024
if (megaByte < 1) {
val result1 = BigDecimal(kiloByte.toString())
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB"
}
val gigaByte = megaByte / 1024
if (gigaByte < 1) {
val result2 = BigDecimal(megaByte.toString())
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB"
}
val teraBytes = gigaByte / 1024
if (teraBytes < 1) {
val result3 = BigDecimal(gigaByte.toString())
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB"
}
val result4 = BigDecimal(teraBytes.toString())
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"
}
}
我的使用:
try {
mBindView.tvCacheSize.text =
CacheDataManager.getLocalCachesSize(this@。。。。)
} catch (e: Exception) {
e.printStackTrace()
}
mBindView.llCacheClear.setOnClickListener {
AlertDialog.Builder(this)
.setTitle("清理缓存")
.setMessage("此操作会导致之前的浏览记录全部清除,是否确定?")
.setNegativeButton("取消", null)
.setPositiveButton("确定") { _, _ ->
this@PersonSettingActivity.showLoginDialog()
GlobalScope.launch(Dispatchers.IO) {
CacheDataManager.clearAllCache(this@。。。。。)
Thread.sleep(1000)
this.launch(Dispatchers.Main) {
"清理完成".toast()
try {
mBindView.tvCacheSize.text = CacheDataManager.getLocalCachesSize(
this@。。。。。
);
dismissDialog()
this@。。。。.dismissDialog()
} catch (e: Exception) {
e.printStackTrace();
}
}
}
}
.show()
}