Android 如何从Http下载相同的Url映像,而不重复httpRequest和异步执行?

Android 如何从Http下载相同的Url映像,而不重复httpRequest和异步执行?,android,Android,我的应用程序中有一个ListView,ListView项将显示图像。 所以我需要异步加载程序从Http加载映像 现在我在谷歌上使用Bitmapfun,但你知道,它很复杂,至少我这么认为 所以我想重新编码,遇到一个问题 如何从Http下载相同的Url映像,并且两者都不重复 httpRequest和异步执行 因为在ListView的项目中,可能会显示相同的图像。 在Bitmapfun中,谷歌“同步”了这个过程,因此它无法并发下载图像 救救我!厚度 对不起,英语不好 例如,ListView有5个项目。

我的应用程序中有一个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只下载一次?”

编辑: 使用惰性列表:

 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