使用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; }}
阅读全文
0 0
- 使用Glide遇到的一些坑
- 【图片加载】Glide的使用以及遇到的一些坑
- 使用glide框架加载图片遇到的一些问题
- Glide使用过程中遇到的坑
- Glide使用中遇到的问题
- Glide里的一些坑
- Glide图片框架遇到的小坑
- Glide使用过程中遇到timeout异常的处理方式
- Glide使用中遇到的问题及解决
- 记glide框架使用中所遇到的问题
- 随手记->使用Glide遇到的第一个问题
- GLIDE 的 一些用法
- 使用cordova遇到的一些坑
- WKWebView使用遇到的一些坑
- 使用Spark遇到的一些坑
- 使用OkHttp3遇到的一些坑
- Glide使用过程中遇到得那些坑
- Glide 显示视频缩略图及遇到的坑
- USB学习:C语言实现模拟对8bit数据的NRZI编码输出
- Spring Boot与ActiveMQ整合
- 程序员的江湖:从黑木崖到回龙观
- 小米多主题思路分析-重定向资源篇
- json数据
- 使用Glide遇到的一些坑
- Java StringBuilder 与 StringBuffer
- 音乐table
- Movavi Screen Capture Pro 9(屏幕录像软件)官方中文版V9.10下载 | screen capture 下载
- javascript总for of和for in的区别
- intel最近几年的挤牙膏到底是因为缺乏竞争力还是摩尔定律已经到头了
- Java 重写与重载之间的区别
- ajax请求的几种方式
- 音乐播放服务