Android 如何从Http下载相同的Url映像,而不重复httpRequest和异步执行?
我的应用程序中有一个ListView,ListView项将显示图像。 所以我需要异步加载程序从Http加载映像 现在我在谷歌上使用Bitmapfun,但你知道,它很复杂,至少我这么认为 所以我想重新编码,遇到一个问题 如何从Http下载相同的Url映像,并且两者都不重复 httpRequest和异步执行 因为在ListView的项目中,可能会显示相同的图像。 在Bitmapfun中,谷歌“同步”了这个过程,因此它无法并发下载图像 救救我!厚度 对不起,英语不好 例如,ListView有5个项目。 每个项目都有一个ImageView来显示图像。 我使用AsyncTask发出Http请求,下载它,放入缓存并显示它 也许这五张照片是 “Hxxp://xxx.com/1.jpg“ “Hxxp://xxx.com/2.jpg“ “Hxxp://xxx.com/3.jpg“ “Hxxp://xxx.com/1.jpg“ “Hxxp://xxx.com/1.jpg" 因此,Http请求中的三个是相同的。 但是异步任务同时也在工作。 因此,另外两个Http请求被重复 我想解决的问题是“如何为AsyncTask下载映像,但如果同一Url只下载一次?” 编辑: 使用惰性列表:Android 如何从Http下载相同的Url映像,而不重复httpRequest和异步执行?,android,Android,我的应用程序中有一个ListView,ListView项将显示图像。 所以我需要异步加载程序从Http加载映像 现在我在谷歌上使用Bitmapfun,但你知道,它很复杂,至少我这么认为 所以我想重新编码,遇到一个问题 如何从Http下载相同的Url映像,并且两者都不重复 httpRequest和异步执行 因为在ListView的项目中,可能会显示相同的图像。 在Bitmapfun中,谷歌“同步”了这个过程,因此它无法并发下载图像 救救我!厚度 对不起,英语不好 例如,ListView有5个项目。
private Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null){
Log.d("ImageLoader", " From Cache" + url);
return b;
}
//from web
try {
Log.d("ImageLoader", " Begin Downloading" + url);
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex){
ex.printStackTrace();
if(ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
初始化ListView,日志为:
04-09 10:44:31.900:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:44:31.910:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:44:31.910:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:44:31.910:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:44:31.930:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:44:33.090:I/MemoryCache(8578):缓存大小=44032长度=1
04-09 10:44:33.090:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-UBmLbPELvoQ/URqucCdv0kI/AAAAAAAAAbs/IdNhr2VQoQs/s1024/Apre%2525CC%252580s%252520la%252520Pluie.jpg
04-09 10:44:33.140:I/MemoryCache(8578):缓存大小=44032长度=1
04-09 10:44:33.140:D/ImageLoader(8578):开始下载hxxps://lh6.googleusercontent.com/-UBmLbPELvoQ/URqucCdv0kI/AAAAAAAAAbs/IdNhr2VQoQs/s1024/Apre%2525CC%252580s%252520la%252520Pluie.jpg
使用
初始化ListView,日志为:
04-09 10:23:24.590:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:23:24.600:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:23:24.600:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:23:24.610:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:23:24.610:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg
04-09 10:23:24.610:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-UBmLbPELvoQ/URqucCdv0kI/AAAAAAAAAbs/IdNhr2VQoQs/s1024/Apre%2525CC%252580s%252520la%252520Pluie.jpg
04-09 10:23:24.610:D/ImageLoader(7336):开始下载hxxps://lh6.googleusercontent.com/-UBmLbPELvoQ/URqucCdv0kI/AAAAAAAAAbs/IdNhr2VQoQs/s1024/Apre%2525CC%252580s%252520la%252520Pluie.jpg
因此,httpRequest是Repeat…您可以使用延迟加载或通用映像加载程序 延迟列表是使用URL从SD卡或fomr服务器延迟加载图像。这就像按需加载图像 图像可以缓存到本地sd卡或手机存储器中。Url被认为是关键。如果钥匙存在于sd卡的sd卡显示图像中,则通过从服务器下载显示图像,并将其缓存到您选择的位置。可以设置缓存限制。您还可以选择自己的位置来缓存图像。缓存也可以被清除 用户不必等待下载大型图像,然后显示延迟列表,而是按需加载图像。由于图像区域已缓存,因此可以脱机显示图像 。懒惰列表 在您的getview中 DisplayImage(imageurl,imageview); 图像加载器显示方法
public void DisplayImage(String url, ImageView imageView) //url and imageview as parameters
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url); //get image from cache using url as key
if(bitmap!=null) //if image exists
imageView.setImageBitmap(bitmap); //dispaly iamge
else //downlaod image and dispaly. add to cache.
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
惰性列表的另一种选择是通用图像加载器
。它基于惰性列表(工作原理相同)。但它有很多其他配置。我更喜欢使用通用图像加载器,因为它为您提供了更多的配置选项。如果downlaod失败,您可以显示错误图像。可以显示圆角的图像。可以缓存在磁盘或内存中。可以压缩图像
在自定义适配器构造函数中
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_id)//display stub image
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
在getView()中
您可以配置其他选项以满足您的需要
随着懒惰加载/通用图像加载器,您可以查看平稳滚动和性能的持有人
编辑:
正如您所见,图像显示两次(下载一次)。但是,它只缓存一次。
下面的图像是图标。我在测试时没有正确缩放它。所以它看起来很长
如果我没有误解您的要求,我建议您使用此选项。您可以发布您的内容吗
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_id)//display stub image
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
ImageView image=(ImageView)vi.findViewById(R.id.imageview);
imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options