我有一个带有适配器的ListView,可以从API加载各种数据。其中一个数据是在线图像的URL。我下载图像并在适配器的ImageView中设置它。
问题是,当我在ListView中向上和向下滚动时,图像被重新下载,并且在执行此操作时会出现明显的延迟。此外,一瞬间,它错误地显示错误的图像。
我需要以某种方式缓存这些图像,只下载一次并在ListView中正确设置它们 - 我该怎么做?
编辑: 我使用通用图像加载器加载我的图像:
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(imageUrl, viewHolder.thumbnailImageView);
但它似乎没有缓存它们......我是否需要做一些额外的事情?
答案 0 :(得分:1)
使用ImageLoaders
ImageView imageView =(ImageView)findViewById(R.id.my_image_view);
Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
简单图像加载。检查可以与听众一起使用的链接。
您也可以尝试:
Android-Universal-Image-Loader
编辑:由于OP说他使用了UIL。]您应该使用Image Aware。 您可以拥有自己的高缓存内存配置。
public void initializeImageLoader(final Context sContext) {
final ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(sContext)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.taskExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
.taskExecutorForCachedImages(AsyncTask.THREAD_POOL_EXECUTOR)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(50 * 1024 * 1024)) // default
.memoryCacheSize(50 * 1024 * 1024)
.imageDownloader(new BaseImageDownloader(sContext)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.build();
ImageLoader.getInstance().init(config);
}
在获得实例之前使用此初始化。
initializeImageLoader(上下文); ImageLoader imageLoader = ImageLoader.getInstance();
为您的装载机设置选项。
final DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.loading)
.showImageForEmptyUri(R.drawable.noimage)
.showImageOnFail(R.drawable.noimage)
.resetViewBeforeLoading(false) //default
.bitmapConfig(Bitmap.Config.RGB_565)
.cacheInMemory(true)
.cacheOnDisk(false) //default
.build();
并将其设置为您的装载机:
final ImageAware imageAware = new ImageViewAware(viewHolder.thumbnailImageView, false);
imageLoader.displayImage(imageUrl, imageAware, options);