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方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值