Glide缓存知识梳理
style: candy
Glide缓存知识梳理
Glide磁盘缓存策略分为四种,默认的是RESULT
1.ALL:缓存原图(SOURCE)和处理图(RESULT)
2.NONE:什么都不缓存
3.SOURCE:只缓存原图(SOURCE)
*4.RESULT:只缓存处理图(RESULT) —默认值
tips:这里原图的意思是假设你的ImageView长100,宽100。图片长300,宽200。那么Glide只缓存300200的图片。处理图的意思是Glide只缓存100100的图片。
组合策略
1.内存不缓存,磁盘缓存缓存所有图片1Glide.with(this).load(mUrl).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(mIv);
2.内存缓存处理图,磁盘缓存原图
|
|
Glide默认缓存路径
默认缓存路径为DiskCache中定义的DEFAULT_DISK_CACHE_DIR,这个值为image_manager_disk_cache。如果不自定义缓存路径,那么默认的缓存完整路径为/data/user/0/包名/cache/image_manager_disk_cache这个目录。
Glide默认缓存大小
默认缓存大小为DiskCache中定义的DEFAULT_DISK_CACHE_SIZE,这个值为250 * 1024 * 1024,即250MB。
自定义缓存路径和缓存大小
- 自定义一个实现了
GlideModule
接口的类,重写applyOptions
方法。
|
|
2.在AndroidManifest.xml
中的<application>
标签下定义<meta-data>
,这样Glide
才能知道我们定义了这么一个类,其中android:name
是我们自定义的GlideModule
的完整路径,而android:value
是固定值GlideModule
。
|
|
Glide清除缓存
- Glide提供两个方法清除缓存,其中
Glide.get(context).clearMemory();
这个方法会清除所有的内存缓存。需要在UI线程操作。Glide.get(context).clearDiskCache();
这个方法会清除所有的磁盘缓存,需要在子线程操作。 - 工具类安利123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133public class GlideCacheUtil {private static GlideCacheUtil instance;public static GlideCacheUtil getInstance() {if (null == instance) {instance = new GlideCacheUtil();}return instance;}// 获取Glide磁盘缓存大小public String getCacheSize(Context context) {return getCacheSize(context,null);}// 获取Glide磁盘缓存大小public String getCacheSize(Context context,String fileName) {try {File cacheFile = null;if (fileName==null){cacheFile = new File(context.getCacheDir() + "/" + InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR);}else{cacheFile = new File(context.getCacheDir() + "/" + fileName);}return getFormatSize(getFolderSize(cacheFile));} catch (Exception e) {e.printStackTrace();return "";}}// 清除图片磁盘缓存,调用Glide自带方法public boolean clearCacheDiskSelf(final Context context) {try {if (Looper.myLooper() == Looper.getMainLooper()) {new Thread(new Runnable() {@Overridepublic void run() {Glide.get(context).clearDiskCache();}}).start();} else {Glide.get(context).clearDiskCache();}return true;} catch (Exception e) {e.printStackTrace();return false;}}// 清除Glide内存缓存public boolean clearCacheMemory(Contenxt context) {try {if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行Glide.get(context).clearMemory();return true;}} catch (Exception e) {e.printStackTrace();}return false;}// 获取指定文件夹内所有文件大小的和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;}// 格式化单位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";}// 按目录删除文件夹文件方法private boolean deleteFolderFile(String filePath, boolean deleteThisPath) {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();}}}return true;} catch (Exception e) {e.printStackTrace();return false;}}}