android實(shí)現(xiàn)清理緩存功能
android之清理緩存實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
一. 清理緩存首先要搞清楚清理哪些東西
1、app本身的功能比如錄像,錄音,更新都會(huì)產(chǎn)生文件,需要清理
2、app的默認(rèn)緩存地址cache
二. 搞清楚要清理的文件夾位置
1、首先app自身的功能就要看自己把它放在了什么位置
2、默認(rèn)緩存地址:getActivity().getExternalCacheDir();
這個(gè)位置是在storage/emulated/0/Android/data/com.xxxxxapp/cache
三.代碼功能模塊:
1、獲取app緩存大小,以字節(jié)為單位
2、獲取某個(gè)文件夾的大小,以字節(jié)為單位
3、把字節(jié)單位換算成常用單位
4、把緩存大小設(shè)置到頁(yè)面,清理前一次,清理后一次
5、刪除文件夾功能
6、清除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());//這行是默認(rèn)的緩存地址,看圖片什么的會(huì)在這里積累緩存 fileSize += getDirSize(videoDir); fileSize += getDirSize(radioDir); fileSize += getDirSize(filesDir); fileSize += getDirSize(cacheDir); String fileSizeStr = formatFileSize(fileSize); Log.d(TAG, "getAppCache: 總緩存大小: "+fileSizeStr); return fileSizeStr; } /** * 獲取文件大小(字節(jié)為單位) * @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();//文件的長(zhǎng)度就是文件的大小 } else if (file.isDirectory()) { dirSize += file.length(); dirSize += getDirSize(file); // 遞歸調(diào)用繼續(xù)統(tǒng)計(jì) } } return dirSize; } /** * 格式化文件長(zhǎng)度 * @param fileSize * @return */ private String formatFileSize(long fileSize){ DecimalFormat df = new DecimalFormat("#0.00");//表示小數(shù)點(diǎn)前至少一位,0也會(huì)顯示,后保留兩位 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: 當(dāng)前緩存"+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 當(dāng)前系統(tǒng)時(shí)間 */ 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; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用CMake構(gòu)建OpenCV項(xiàng)目過(guò)程解析
這篇文章主要介紹了使用CMake構(gòu)建OpenCV項(xiàng)目過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11詳解用RxJava實(shí)現(xiàn)事件總線(Event Bus)
本篇文章主要介紹了用RxJava實(shí)現(xiàn)事件總線(Event Bus),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Android自定義View實(shí)現(xiàn)圓弧進(jìn)度效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓弧進(jìn)度效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11android使用webwiew載入頁(yè)面使用示例(Hybrid App開(kāi)發(fā))
Hybrid App 融合 Web App 的原理就是嵌入一個(gè)WebView組件,可以在這個(gè)組件中載入頁(yè)面,相當(dāng)于內(nèi)嵌的瀏覽器,下面是使用示例2014-03-03Android編程實(shí)現(xiàn)點(diǎn)擊EditText之外的控件隱藏軟鍵盤(pán)功能
這篇文章主要介紹了Android編程實(shí)現(xiàn)點(diǎn)擊EditText之外的控件隱藏軟鍵盤(pán)功能,涉及Android控件的功能、屬性及相關(guān)操作技巧,需要的朋友可以參考下2017-06-06Android源碼學(xué)習(xí)之工廠方法模式應(yīng)用及優(yōu)勢(shì)介紹
工廠方法模式定義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類,感興趣的朋友可以了解下哦2013-01-01Android中阻止AlertDialog關(guān)閉實(shí)例代碼
這篇文章主要介紹了Android阻止AlertDialog關(guān)閉實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-03-03Android自定義View實(shí)現(xiàn)價(jià)格區(qū)間選擇控件
這篇文章主要為大家詳細(xì)介紹了Android如何利用自定義View實(shí)現(xiàn)價(jià)格區(qū)間選擇控件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11Android RecycleView使用(CheckBox全選、反選、單選)
這篇文章主要為大家詳細(xì)介紹了Android RecycleView使用,CheckBox全選、反選、單選效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09