Fresco自定义缓存的KEY以及判断自定义缓存是否成功

原因

最近公司项目要求浏览高清的网络图片以及GIf图片,就在网上找了下相关的图片加载网络库,比较中意Glide,但后台兄弟把cookie加到了http的URl里面。导致我每次都要重新下载图片,找到原因后,我的表情是这样的:
目瞪狗带
后来发现glide想要自定义缓存的key值比较困难,无奈只能挥泪放弃google爸爸的大粗腿。

柳暗花明

后来有人推荐了Facebook(又是一条大粗腿)开源的网络图片加载库Fresco,可以方便的替换缓存的缓存生成的工厂类。
Fresco的缓存类是DefaultCacheKeyFactory,里面代码理解起来也比较简单,如下:

public class DefaultCacheKeyFactory implements CacheKeyFactory {
        private static DefaultCacheKeyFactory sInstance = null;
        protected DefaultCacheKeyFactory() {
      }
        public static synchronized DefaultCacheKeyFactory getInstance() {
    if (sInstance == null) {
      sInstance = new DefaultCacheKeyFactory();
    }
    return sInstance;
      }
    @Override
    public CacheKey getBitmapCacheKey(ImageRequest request) {
            return new BitmapMemoryCacheKey(
       getCacheKeySourceUri(request.getSourceUri()).toString(),
        request.getResizeOptions(),
        request.getAutoRotateEnabled(),
        request.getImageDecodeOptions(),
        null,
        null);
      }
      @Override
  public CacheKey getPostprocessedBitmapCacheKey(ImageRequest request) {
    final Postprocessor postprocessor = request.getPostprocessor();
    final CacheKey postprocessorCacheKey;
    final String postprocessorName;
    if (postprocessor != null) {
      postprocessorCacheKey = postprocessor.getPostprocessorCacheKey();
      postprocessorName = postprocessor.getClass().getName();
    } else {
      postprocessorCacheKey = null;
      postprocessorName = null;
    }
    return new BitmapMemoryCacheKey(
        getCacheKeySourceUri(request.getSourceUri()).toString(),
        request.getResizeOptions(),
        request.getAutoRotateEnabled(),
        request.getImageDecodeOptions(),
        postprocessorCacheKey,
        postprocessorName);
  }

  @Override
  public CacheKey getEncodedCacheKey(ImageRequest request) {
    return new SimpleCacheKey(getCacheKeySourceUri(request.getSourceUri()).toString());
  }

  /** * @return a {@link String} that unambiguously indicates the source of the image. */
  protected Uri getCacheKeySourceUri(Uri sourceUri) {
    return sourceUri;
  }
}

里面Fresco默认使用url作为缓存的生成的条件之一,而由于后台兄弟让url不断地变化,因此我们只能截取图片的名字替代url作为缓存条件,截取图片名字的函数如下

public string getImageName(String url){
    int leng = url.lastIndexOf("/");
        return url.substring(leng + 1, url.length());
}

最后我们只需要模仿Fresco的缓存key值生成类,把当中三处的request.getSourceUri()).toString()替换成getImageName(request.getSourceUri()).toString)就好了,这样就可以让fresco按照我们的想法进行key的缓存了。
最后我们需要在配置的时候用我们自定义的缓存类替代掉原本默认的缓存类:

ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
                .setCacheKeyFactory(new MyCacheKeyFactory())
                .build();
        Fresco.initialize(context,config);

自定义缓存基本就完成了!

自定缓存的获取

根据官网的API文档,如果自定义了缓存,那么判断图片是否缓存在手机上就要使用ImageRequest和我们的自定义缓存工厂类生产MyCacheKeyFactory生成的缓存了,代码如下:

ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))
                    .build();
boolean isCacheInDisk = Fresco.getImagePipelineFactory().getMainDiskStorageCache().hasKey(MyCacheKeyFactory.getInstance().getEncodedCacheKey(request));

以上只是本人对Fresco缓存的初步了解和使用,如果有不对的地方,欢迎拍砖,希望和大家一起共同进步。

你可能感兴趣的:(网络,图片,缓存,Fresco,图片加载框架)