Android Universal Image Loader

问题:在onCreate调用uil的displayImage,手动刷新时再次调用displayImage,会出现图片闪烁现象。

问题分析:第二次displayImage,是从disk加载的,首先显示正在加载中的图片,然后在显示真正的图片,由于disk读取bitmap也需要一点时间,但是很快,所以会出现一闪而过的现象。
根本原因:见uil源码,由这段源码可知memoryCacheKey的生成与imageView的相关,我们知道在onCreate的方法里不能正确获取ImageView的width,height。两次的memoryCacheKey不一样,不能复用。因而有闪烁问题。
ImageLoader.java

ImageViewAware imageAware=new ImageViewAware(imageView)
ImageSize targetSize = ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());
String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);

ImageSizeUtils.java

public static ImageSize defineTargetSizeForView(ImageAware imageAware, ImageSize maxImageSize) {
    int width = imageAware.getWidth();
    if (width <= 0) width = maxImageSize.getWidth();

    int height = imageAware.getHeight();
    if (height <= 0) height = maxImageSize.getHeight();

    return new ImageSize(width, height);
}

MemoryCacheUtils.java

public static String generateKey(String imageUri, ImageSize targetSize) {
    return new StringBuilder(imageUri).append(URI_AND_SIZE_SEPARATOR).append(targetSize.getWidth()).append(WIDTH_AND_HEIGHT_SEPARATOR).append(targetSize.getHeight()).toString();
}

解决办法

  • 使用DisplayImageOptions.targetSize(ImageSize),需要uil 1.9.5+以上。(这个办法最为推荐,但是uil以停止开发,也可以自己实现)
  • 在java代码中动态指定ImageView的width和height(目前,简单可行)
  • 使用ImageLoader.loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
    ImageLoadingListener listener)(可以使用原有xml的imageview大小,但是java代码臃肿)]
  • 继承
    FuzzyKeyMemoryCache(MemoryCache cache, Comparator<String> keyComparator)的重写get、remove方法

你可能感兴趣的:(memcache,闪烁,UIL)