在我的Android应用程序中,我有很多ListView。对于listView的每个项目,我有一个TextView和一个ImageView。
我使用适配器显示项目和AsynTask从服务器下载图像。当我向下滚动ListView时,会下载图像。但是当我向上滚动时,已经下载的图像会再次下载。
我想创建一种图像缓存,你明白我的问题吗?
这是我的ListView的类型:Image + TXT:
http://www.androidhive.info/wp-content/uploads/2012/05/android_custom_listview_onhover.png?7885e2
非常感谢!
答案 0 :(得分:2)
那是因为你没有缓存图像。每次滚动的项目重新进入视图时,您最终会再次访问服务器以获取图像。想省点麻烦吗?试试Picasso。
处理Android上图像加载的许多常见缺陷 由毕加索自动完成:
在适配器中处理ImageView回收和下载取消 复杂的图像变换,内存使用最少 自动内存和磁盘缓存。
答案 1 :(得分:2)
我强烈建议您使用库进行图片加载,例如Android Universal Image Loader或Picasso
这些库将为您负责加载和缓存。
答案 2 :(得分:0)
制作用户通用图片下载器。 它是加载远程图像和易于使用的最佳库。 参考这个, https://github.com/nostra13/Android-Universal-Image-Loader
使用方法: 使用下面的行创建实例并加载
ImageLoader imageLoader; //初始化它。
imageLoader.displayImage(imageUri,imageView);
答案 3 :(得分:0)
AQuery 可让您从服务器加载图片并将其设置为ImageView
。它还提供了缓存图像文件缓存和内存缓存的选项。点击此处查看AQuery image loading。
示例代码:
boolean memCache = false;
boolean fileCache = true;
aq.id(R.id.image1).image("http://example.com/yourImage.png", memCache, fileCache);
它还为以下图像提供回调:
aq.id(R.id.image1).image(imageUrl, true, true, 0, 0, new BitmapAjaxCallback(){
@Override
public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status){
iv.setImageBitmap(bm);
//do something to the bitmap
iv.setColorFilter(tint, PorterDuff.Mode.SRC_ATOP);
}
});
答案 4 :(得分:0)
SmartImageView是解决此问题的完美解决方案
答案 5 :(得分:0)
对它使用延迟加载,并首先将URL存储在列表视图中,然后按照我在步骤4中的操作进行操作。下面给出了它的步骤:
步骤1:通过以下网址下载通用图片下载jar: http://www.java2s.com/Code/Jar/u/Downloaduniversalimageloaderjar.htm
第2步: - 将此代码放入您的应用程序文件中:
文件cacheDir = com.nostra13.universalimageloader.utils.StorageUtils .getCacheDirectory(本);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
this)
.memoryCacheExtraOptions(480, 120)
// default
// =
// device
// screen
// dimensions
.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
.threadPoolSize(3)
// default
.threadPriority(Thread.NORM_PRIORITY - 1)
// default
.tasksProcessingOrder(QueueProcessingType.FIFO)
// default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024).memoryCacheSizePercentage(13)
// default
.discCache(new UnlimitedDiscCache(cacheDir))
// default
.discCacheSize(50 * 1024 * 1024).discCacheFileCount(100)
.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(this)) // default
.imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs().build();
ImageLoader.getInstance().init(config);
第3步: - 将此代码放在您活动的onCreate()中: 私有DisplayImageOptions选项;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.iclauncher) // resource or
// drawable
.showImageForEmptyUri(R.drawable.iclauncher) // resource or
// drawable
.showImageOnFail(R.drawable.iclauncher) // resource or
// drawable
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000).cacheInMemory(true) // default
.cacheOnDisc(true) // default
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_INT) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
imageLoader = ImageLoader.getInstance();
步骤4: - 将此代码放入适配器中 imageLoader.displayImage(alist.get(位置).getThumbnails(), holder.ivImage,options,null); // holder.ivImage是我的图片视图,alist.get(position).getThumbnails()是我的图片网址