我有一个 ListView,其中的项目具有不同数量的图像。每个项目都放入具有水平 LinearLayout 的 HorizontalScrollView 中,我将 ImageView 动态添加到 LinearLayout 中。
我用了Android-Universal-Image-Loader从本地 sdcard 异步加载图像。我在自定义应用程序类的 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左右。不知道是不是原图太大了。
感谢您的建议!
最佳答案
发现发生了什么。
简而言之:缓存图片太大。
我使用了 ImageView 的相对大小:[wrap_content, match_parent] 而不是设置固定大小。所以 ImageLoader 缓存了我在日志中看到的所有图像的最大可能大小,这是我的设备大小:1080x1800。这也非常大,导致重新加载缓慢。
解决方法:
设置 ImageView 的固定大小。或者,如果您不想,请设置 ImageView 的最大可能宽度和高度。设置最大高度后,我的图片缓存为 250x250,加载延迟几乎消失了。
参见 Useful Info获取更多信息。
关于ListView 中的 Android Universal ImageLoader 滚动非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737625/