使用Glide遇到的一些坑

来源:互联网 发布:淘宝鹏飞运动怎么样 编辑:程序博客网 时间:2024/05/21 14:07

1.如果ImageView不可见 或者 width为0 或者 height为0,glide是不会加载图像的。项目中遇到ImageView并没有add到UI上,只是用来加载图像,获取drawing cache,就掉坑了。

2.不支持多磁盘缓存目录,很多人也提过这个issue。
根据作者提供的思路,可以通过继承DiskLruCacheWrapper,依据不同请求的signature来分发不同的磁盘缓存目录,但是需要一些反射的手段。

MultiFolderDiskLruCacheWrapper.java

/** * 支持多个磁盘缓存目录 */public class MultiFolderDiskLruCacheWrapper extends DiskLruCacheWrapper {  private static final String TAG = "MultiFolderDiskLruCacheWrapper";  private static Field sFieldSignatureInResourceCacheKey;  private static Field sFieldSignatureInDataCacheKey;  private static MultiFolderDiskLruCacheWrapper wrapper;  static {    try {      Class<?> resourceCacheKeyClass = Class.forName("com.bumptech.glide.load.engine.ResourceCacheKey");      sFieldSignatureInResourceCacheKey = resourceCacheKeyClass.getDeclaredField("signature");      sFieldSignatureInResourceCacheKey.setAccessible(true);      Class<?> DataCacheKeyClass = Class.forName("com.bumptech.glide.load.engine.DataCacheKey");      sFieldSignatureInDataCacheKey = DataCacheKeyClass.getDeclaredField("signature");      sFieldSignatureInDataCacheKey.setAccessible(true);    } catch (ClassNotFoundException e) {      WwLog.log(Log.WARN, TAG, "find ResourceCacheKey failed", e);    } catch (NoSuchFieldException e) {      WwLog.log(Log.WARN, TAG, "reflect signature failed", e);    } catch (Error error) {      WwLog.log(Log.WARN, TAG, "reflect signature failed", error);    }  }  private DiskCache[] diskCaches = new DiskCache[CacheFolder.values().length];  public static synchronized DiskCache get() {    if (wrapper == null) {      wrapper = new MultiFolderDiskLruCacheWrapper(null, 0);    }    return wrapper;  }  protected MultiFolderDiskLruCacheWrapper(File directory, int maxSize) {    super(directory, maxSize);  }  @Override  public File get(Key key) {    return getDiskCacheBySignature(key).get(key);  }  @Override  public void put(Key key, Writer writer) {    getDiskCacheBySignature(key).put(key, writer);  }  @Override  public void delete(Key key) {    getDiskCacheBySignature(key).delete(key);  }  @Override  public synchronized void clear() {    for (DiskCache diskCache : diskCaches) {      if (diskCache != null) {        diskCache.clear();      }    }  }  /**   * 根据key选择不同的DiskCache实例,每个DiskCache实例对应不同缓存目录   * @param key   * @return   */  private DiskCache getDiskCacheBySignature(Key key) {    Object signature = getSignature(key);    CacheFolder cacheFolder;    if (isContact(signature)) {      cacheFolder = CacheFolder.CONTACHT;    } else {      cacheFolder = CacheFolder.OTHER;    }    return getDiskCache(cacheFolder);  }  @Nullable  private Object getSignature(Key key) {    Object signature = null;    try { // 已有缓存的情况下一般是ResourceCacheKey,所以这种情况更常见      signature = sFieldSignatureInResourceCacheKey.get(key);    } catch (Exception e) {      WwLog.log(Log.INFO, TAG, "getSignature: " + e.getMessage());    }    if (signature != null) return  signature;    try {      signature = sFieldSignatureInDataCacheKey.get(key);    } catch (Exception e) {      WwLog.log(Log.INFO, TAG, "getSignature", e);    }    return signature;  }  private boolean isContact(Object signature) {    return signature instanceof ContactSignature;  }  @NonNull  private DiskCache getDiskCache(CacheFolder cacheFolder) {    DiskCache diskCache = diskCaches[cacheFolder.index];    if (diskCache == null) {      String cachePath = FileUtil.getImageDiskCacheDirPath(cacheFolder.cacheDirName);      if (FileUtil.createDir(cachePath)) {        try {          diskCache = (DiskLruCacheWrapper) ReflecterHelper.newInstance(                  "com.bumptech.glide.load.engine.cache.DiskLruCacheWrapper", new Object[]{new File(cachePath), cacheFolder.cacheSize});          diskCaches[cacheFolder.index] = diskCache;        } catch (Exception e) {          WwLog.log(Log.ERROR, TAG, "getDiskCache", e);        }      }    }    return diskCache;  }}

CacheFolder.java

public enum CacheFolder {    CONTACHT(0, 1024 * 1024 * 50, "glidecontactphoto"),    IMAGE(1, 1024 * 1024 * 100, "glideimage"),    OTHER(2, 1024 * 1024 * 50, "glideother"),    ;    public int index;    public int cacheSize;    public String cacheDirName;    CacheFolder(int index, int cacheSize, String cacheDirName) {        this.index = index;        this.cacheSize = cacheSize;        this.cacheDirName = cacheDirName;    }}