android之清理緩存實作
一. 清理緩存首先要搞清楚清理哪些東西,
- app本身的功能比如錄像,錄音,更新都會産生檔案,需要清理
- app的預設緩存位址cache
二. 搞清楚要清理的檔案夾位置
- 首先app自身的功能就要看自己把它放在了什麼位置
-
預設緩存位址:getActivity().getExternalCacheDir();
這個位置是在storage/emulated/0/Android/data/com.xxxxxapp/cache
三. 搞起
代碼功能子產品:
- 擷取app緩存大小,以位元組為機關
- 擷取某個檔案夾的大小,以位元組為機關
- 把位元組機關換算成常用機關
- 把緩存大小設定到頁面,清理前一次,清理後一次
- 删除檔案夾功能
- 清除app緩存
/**
* 擷取app的緩存大小
* 1. 錄制的視訊/storage/emulated/0/xueliangapp/video/1573972925136.mp4
* 2. 錄制的音頻/storage/emulated/0/xueliangapp/radio/1573972925136.amr
* 3. 下載下傳的更新包/storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/files/Download/xueliang_update.apk
* 4. 緩存/storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/cache
*/
File videoDir,radioDir,filesDir,cacheDir;
private String getAppCache(){
long fileSize = 0;
String cacheSize = "0KB";
videoDir = new File(Environment.getExternalStorageDirectory()+"/xueliangapp/video");
Log.d(TAG, "getAppCache: videoDir大小: "+getDirSize(videoDir));
radioDir = new File(Environment.getExternalStorageDirectory()+"/xueliangapp/radio");
Log.d(TAG, "getAppCache: radioDir大小: "+getDirSize(radioDir));
filesDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
Log.d(TAG, "getAppCache: filesDir大小: "+getDirSize(filesDir));
///storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/files,這裡面有download檔案夾,裡面是下載下傳的更新包
cacheDir = getActivity().getExternalCacheDir();
Log.d(TAG, "getAppCache: cacheDir大小: "+getDirSize(cacheDir));
///storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/cache
fileSize += getDirSize(getActivity().getFilesDir());
fileSize += getDirSize(getActivity().getCacheDir());//這行是預設的緩存位址,看圖檔什麼的會在這裡積累緩存
fileSize += getDirSize(videoDir);
fileSize += getDirSize(radioDir);
fileSize += getDirSize(filesDir);
fileSize += getDirSize(cacheDir);
String fileSizeStr = formatFileSize(fileSize);
Log.d(TAG, "getAppCache: 總緩存大小: "+fileSizeStr);
return fileSizeStr;
}
/**
* 擷取檔案大小(位元組為機關)
* @param dir
* @return
*/
private long getDirSize(File dir) {
if (dir == null) {
return 0;
}
if (!dir.isDirectory()) {
return 0;
}
long dirSize = 0;
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
dirSize += file.length();//檔案的長度就是檔案的大小
} else if (file.isDirectory()) {
dirSize += file.length();
dirSize += getDirSize(file); // 遞歸調用繼續統計
}
}
return dirSize;
}
/**
* 格式化檔案長度
* @param fileSize
* @return
*/
private String formatFileSize(long fileSize){
DecimalFormat df = new DecimalFormat("#0.00");//表示小數點前至少一位,0也會顯示,後保留兩位
String fileSizeString = "";
if (fileSize < 1024) {
fileSizeString = df.format((double) fileSize) + "B";
} else if (fileSize < 1048576) {
fileSizeString = df.format((double) fileSize / 1024) + "KB";
} else if (fileSize < 1073741824) {
fileSizeString = df.format((double) fileSize / 1048576) + "MB";
} else {
fileSizeString = df.format((double) fileSize / 1073741824) + "G";
}
return fileSizeString;
}
private void setAppCache() {
String fileSize = getAppCache();
fileSizeTv.setText(fileSize);
Log.d(TAG, "setAppCache: 重新顯示緩存大小");
Log.d(TAG, "setAppCache: 目前緩存"+fileSize);
}
public void clearAppCache(final Activity activity){
final Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.d(TAG, "handlerMessage: ");
if (msg.what == 1) {
setAppCache();
Log.d(TAG, "handlerMessage: 緩存清除完畢");
ToastUtil.showMsg(getActivity(),"緩存清除完畢");
}else {
ToastUtil.showMsg(getActivity(),"緩存清除失敗");
Log.d(TAG, "handlerMessage: 緩存清除失敗");
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "run: ");
Message msg = new Message();
try {
clearCacheFolder(videoDir,System.currentTimeMillis());
clearCacheFolder(radioDir,System.currentTimeMillis());
clearCacheFolder(filesDir,System.currentTimeMillis());
clearCacheFolder(cacheDir,System.currentTimeMillis());
msg.what = 1;
}catch (Exception e){
e.printStackTrace();
msg.what = -1;
}
handler.sendMessage(msg);
}
}).start();
}
/**
* 清除緩存目錄
* @param dir 目錄
* @param curTime 目前系統時間
*/
private int clearCacheFolder(File dir,long curTime){
int deletedFiles = 0;
if (dir!= null && dir.isDirectory()) {
try {
for (File child:dir.listFiles()) {
if (child.isDirectory()) {
deletedFiles += clearCacheFolder(child, curTime);
}
if (child.lastModified() < curTime) {
if (child.delete()) {
deletedFiles++;
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
Log.d(TAG, "clearCacheFolder: 清除目錄: "+dir.getAbsolutePath());
return deletedFiles;
}