我有一个ListView,其中的项目具有不同数量的图像。每个项目都放入一个水平LinearLayout的HorizontalScrollView中,我将ImageViews动态添加到LinearLayout中。
我使用Android-Universal-Image-Loader异步加载来自本地SD卡的图像。我在自定义Application类的onCreate方法中设置了ImageLoaderConfiguration:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.diskCacheSize(200 * 1024 * 1024) // 200 Mb
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
.build();
ImageLoader.getInstance().init(config);
在Adapter类的构造函数方法中设置DisplayImageOptions:
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_loading)
.showImageForEmptyUri(R.drawable.ic_loading_failed)
.showImageOnFail(R.drawable.ic_loading_failed)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.build();
我在getView方法中动态加载图像:
ImageLoader.getInstance().displayImage(imageURI, imageView, options);
我的问题是,当我滚动ListView时,图像将重新加载非常慢,实际上与第一次加载速度相同。似乎每个图像都是从磁盘加载而没有缓存。
PS:我的照片大多是从相机拍摄的,大小约为2MB~3MB。我不确定是不是因为原始图像太大了。感谢您的建议!
答案 0 :(得分:3)
发现了正在发生的事情。
简而言之:缓存的图片太大了。
我使用ImageView的相对大小:[wrap_content,match_parent]而不是设置固定大小。所以ImageLoader缓存了我在日志中看到的所有图像的最大可能尺寸,这是我的设备尺寸:1080x1800。而且这也非常大,导致重新加载缓慢。
要解决它:
设置ImageView的固定大小。或者,如果您不想,请设置ImageView的最大可能宽度和高度。设置最大高度后,我的图像缓存到250x250,加载延迟几乎消失。
有关详细信息,请参阅Useful Info。