Android中Glide獲取緩存大小并清除緩存圖片
清除Glide緩存
Glide自帶清除緩存的功能,分別對(duì)應(yīng)Glide.get(context).clearDiskCache();(清除磁盤(pán)緩存)與Glide.get(context).clearMemory();(清除內(nèi)存緩存)兩個(gè)方法.其中clearDiskCache()方法必須運(yùn)行在子線程,clearMemory()方法必須運(yùn)行在主線程,這是這兩個(gè)方法所強(qiáng)制要求的,詳見(jiàn)源碼.
獲取Glide緩存空間大小
這個(gè)網(wǎng)上也有過(guò)一些介紹,但是給出的實(shí)現(xiàn)代碼存在一些問(wèn)題,我這里做了一定的修改.一下方法適合在Glide為默認(rèn)的緩存目錄的情況,不論是內(nèi)部存儲(chǔ)空間還是外部.因?yàn)槲覀兛梢酝ㄟ^(guò)InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR與ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR獲取到位于內(nèi)部與外部存儲(chǔ)的緩存文件夾的文件夾名,并通過(guò)context.getCacheDir()與context.getExternalCacheDir()獲取內(nèi)部與外部存儲(chǔ)的路徑.進(jìn)而可以通過(guò)遍歷文件夾內(nèi)的文件進(jìn)行緩存文件大小求和與全部清除.以下工具類在其他的文章中有前輩寫(xiě)過(guò),但是存在一些已知的問(wèn)題,這里做了一些修改.
import android.content.Context; import android.os.Looper; import android.text.TextUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory; import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory; import java.io.File; import java.math.BigDecimal; /**Glide緩存工具類 * Created by Trojx on 2016/10/10 0010. */ public class GlideCacheUtil { private static GlideCacheUtil inst; public static GlideCacheUtil getInstance() { if (inst == null) { inst = new GlideCacheUtil(); } return inst; } /** * 清除圖片磁盤(pán)緩存 */ public void clearImageDiskCache(Context context) { try { if (Looper.myLooper() == Looper.getMainLooper()) { new Thread(new Runnable() { @Override public void run() { Glide.get(context).clearDiskCache(); // BusUtil.getBus().post(new GlideCacheClearSuccessEvent()); } }).start(); } else { Glide.get(context).clearDiskCache(); } } catch (Exception e) { e.printStackTrace(); } } /** * 清除圖片內(nèi)存緩存 */ public void clearImageMemoryCache(Context context) { try { if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主線程執(zhí)行 Glide.get(context).clearMemory(); } } catch (Exception e) { e.printStackTrace(); } } /** * 清除圖片所有緩存 */ public void clearImageAllCache(Context context) { clearImageDiskCache(context); clearImageMemoryCache(context); String ImageExternalCatchDir=context.getExternalCacheDir()+ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR; deleteFolderFile(ImageExternalCatchDir, true); } /** * 獲取Glide造成的緩存大小 * * @return CacheSize */ public String getCacheSize(Context context) { try { return getFormatSize(getFolderSize(new File(context.getCacheDir() + "/"+InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR))); } catch (Exception e) { e.printStackTrace(); } return ""; } /** * 獲取指定文件夾內(nèi)所有文件大小的和 * * @param file file * @return size * @throws Exception */ private long getFolderSize(File file) throws Exception { long size = 0; try { File[] fileList = file.listFiles(); for (File aFileList : fileList) { if (aFileList.isDirectory()) { size = size + getFolderSize(aFileList); } else { size = size + aFileList.length(); } } } catch (Exception e) { e.printStackTrace(); } return size; } /** * 刪除指定目錄下的文件,這里用于緩存的刪除 * * @param filePath filePath * @param deleteThisPath deleteThisPath */ private void deleteFolderFile(String filePath, boolean deleteThisPath) { if (!TextUtils.isEmpty(filePath)) { try { File file = new File(filePath); if (file.isDirectory()) { File files[] = file.listFiles(); for (File file1 : files) { deleteFolderFile(file1.getAbsolutePath(), true); } } if (deleteThisPath) { if (!file.isDirectory()) { file.delete(); } else { if (file.listFiles().length == 0) { file.delete(); } } } } catch (Exception e) { e.printStackTrace(); } } } /** * 格式化單位 * * @param size size * @return size */ private 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"; } }
通過(guò)它就能實(shí)現(xiàn)一個(gè)清除圖片緩存的功能,在應(yīng)用中實(shí)現(xiàn)的效果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android異步下載圖片并且緩存圖片到本地DEMO詳解
- Android基于SoftReference緩存圖片的方法
- Android Universal ImageLoader 緩存圖片
- android實(shí)現(xiàn)緩存圖片等數(shù)據(jù)
- android中圖片的三級(jí)緩存cache策略(內(nèi)存/文件/網(wǎng)絡(luò))
- Android中Glide加載庫(kù)的圖片緩存配置究極指南
- android異步加載圖片并緩存到本地實(shí)現(xiàn)方法
- Android中Glide加載圖片并實(shí)現(xiàn)圖片緩存
- Android實(shí)現(xiàn)緩存大圖到SD卡
相關(guān)文章
Android開(kāi)發(fā)返回鍵明暗點(diǎn)擊效果的實(shí)例代碼
這篇文章主要介紹了Android開(kāi)發(fā)返回鍵明暗點(diǎn)擊效果的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04如何利用Kotlin實(shí)現(xiàn)極簡(jiǎn)回調(diào)
這篇文章主要給大家介紹了關(guān)于如何利用Kotlin實(shí)現(xiàn)極簡(jiǎn)回調(diào)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Android應(yīng)用中制作選中后圖標(biāo)變大浮動(dòng)效果的代碼分享
這篇文章主要介紹了Android應(yīng)用中制作選中后圖標(biāo)變大浮動(dòng)效果的代碼分享,這里作者舉了一個(gè)體育賽事app的例子,需要的朋友可以參考下2016-02-02Android開(kāi)發(fā)自學(xué)筆記(三):APP布局上
這篇文章主要介紹了Android開(kāi)發(fā)自學(xué)筆記(三):APP布局上,本文講解了添加ViewGroup、添加ViewGroup、定義string內(nèi)容、添加Button、運(yùn)行程序查看效果等內(nèi)容,需要的朋友可以參考下2015-04-04Android?廣播接收器BroadcastReceiver詳解
Android開(kāi)發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件2022-07-07AndroidHttpClient詳解及調(diào)用示例
本文給大家介紹AndroidHttpClient結(jié)構(gòu)、使用方式及調(diào)用示例詳解,需要的朋友可以參考下2015-10-10Android中二維碼的掃描和生成(使用zxing庫(kù))
ZXing是一個(gè)開(kāi)放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口,下面這篇文章主要給大家介紹了關(guān)于Android中二維碼掃描和生成的相關(guān)資料,主要使用的zxing庫(kù),需要的朋友可以參考下2022-09-09Android View添加 Listener 實(shí)例代碼
在開(kāi)發(fā)中為控件添加Listener是非常常見(jiàn)的工作,最簡(jiǎn)單的添加Listener方式可以這樣2013-05-05