从Glide获取磁盘缓存

这个需求来源是在一个图片的列表里。这个图片列表显示的是缩略图,然后点击图片要打开对应的大图模式。但是加载大图比较耗时,所以先显示缩略图,等大图加载下来的时候在替换缩略图。本来感觉这个需求没啥难度,就是在加载大图前加一步检测有没有缩略图,然后加载就行了。。但是,glide尽然没有提供一个简单的获取磁盘缓存的方法。。。。。

好吧,开始趟坑之路。

其实做之前想了下,图片加载的三级缓存这个感觉是基本的功能啊。所以获取磁盘缓存坑定是有的,可能glide是没有对外提供?但是他们坑定有的,所以网上找了个方法DiskUrlCacheWrapper里面的get方法可以获取到。然后当时测试也没问题,具体代码如下:

 File file = DiskLruCacheWrapper.get(Glide.getPhotoCacheDir(mActivity), 250 * 1024 * 1024).get(new OriginalKey(url, EmptySignature.obtain()));

其中OriginalKey是自己写的代码如下:

   private class OriginalKey implements Key {
        private final String id;
        private final Key signature;
        private OriginalKey(String id, Key signature) {
            this.id = id;
            this.signature = signature;
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            OriginalKey that = (OriginalKey) o;
            return id.equals(that.id) && signature.equals(that.signature);
        }
        @Override
        public int hashCode() {
            int result = id.hashCode();
            result = 31 * result + signature.hashCode();
            return result;
        }
        @Override
        public void updateDiskCacheKey(MessageDigest messageDigest) {
            try {
                messageDigest.update(id.getBytes(STRING_CHARSET_NAME));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            signature.updateDiskCacheKey(messageDigest);
        }

    }

做完后没问题还是比较happy的,然而,前几天一个同事过来说,你做的那个图片缓存功能在我那怎么没用啊?我:????

当时第一反应就是,这哥们做了啥奇葩操作?然后去看了下他使用的代码,glide使用没啥问题,也没禁用磁盘缓存,缓存策略也ok。但是,我记得我们统一封装了glide工具类了啊,你为啥自己写了一套了?而且,你为啥要使用load(file)的形式去做了?明明直接glide就可以支持本地路径形式的url啊。。。

好了吐槽完后,发现就是load(file)部分的图片在使用上面获取缓存的方式时候没找到,先去看看注释里面有没有解释,如下:

this method caches data for Files using only the file path itself as the cache key.

没问题啊,会将文件的路径作为key缓存进去,然后我看了下,给我传过来的就是文件的路径呀,为啥我获取不到?T.T 同事

那边也不好处理,只能我这边获取缓存的方式搞搞了。。这次感觉还是去glide的git上面找找吧。感觉这个问题是常用的啊。。然后,找到的方法如下:

 class GetGlideCacheTask extends AsyncTask<String, Void, File> {
        public GetGlideCacheTask() {
        }
        @Override
        protected File doInBackground(String... params) {
            String url = params[0]; // should be easy to extend to share multiple images at once
            if (TextUtils.isEmpty(url)) {
                return null;
            }
            try {
                // Glide v3
                return Glide
                        .with(mActivity)
                        .load(url)
                        .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                        .get() // needs to be called on background thread
                        ;
            } catch (Exception ex) {
                Log.w("SHARE", "Sharing " + url + " failed", ex);
                return null;
            }
        }
        @Override
        protected void onPostExecute(File result) {
            if (result == null) {
                return;
            }
          //使用文件
        }

    }

代码来源 这里可以查看方案来源

使用这个方式后就没啥问题了。希望出坑了吧。。。T0T


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值