问题:在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方法