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.内存不缓存,磁盘缓存缓存所有图片

1
Glide.with(this).load(mUrl).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(mIv);

2.内存缓存处理图,磁盘缓存原图

1
Glide.with(this).load(mUrl).skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(mIv);

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。

自定义缓存路径和缓存大小

  1. 自定义一个实现了GlideModule接口的类,重写applyOptions方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyGlideModule implements GlideModule {
// 图片缓存最大容量,150M,根据自己的需求进行修改
public static final int GLIDE_CATCH_SIZE = 100 * 1000 * 1000;
//图片缓存子目录
public static final String GLIDE_CARCH_DIR = "my_cache_dir"; @Override
public void applyOptions(Context context, GlideBuilder builder) {
//自定义缓存目录和大小
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,GLIDE_CARCH_DIR,GLIDE_CATCH_SIZE));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}

2.在AndroidManifest.xml中的<application>标签下定义<meta-data>,这样Glide才能知道我们定义了这么一个类,其中android:name是我们自定义的GlideModule的完整路径,而android:value是固定值GlideModule

1
2
3
<meta-data
android:name="com.demo.glide.MyGlideModule"
android:value="GlideModule" />

Glide清除缓存

  1. Glide提供两个方法清除缓存,其中Glide.get(context).clearMemory();这个方法会清除所有的内存缓存。需要在UI线程操作。Glide.get(context).clearDiskCache();这个方法会清除所有的磁盘缓存,需要在子线程操作。
  2. 工具类安利
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    public 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() {
    @Override
    public 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;
    }
    }
    }