2013-04-04 60 views
0

我使用从这link lazyloading从url设置图像,我有非常大的位图..在我的列表视图有很多图像加载和当我滚动列表视图20-30这是错误的outofmemory ..如何,我可以解决这个错误..?从url加载大图像时OutOfMemory错误

+0

你有什么尝试? – 2013-04-04 13:13:57

回答

0

检查该库的延迟加载Android-Universal-Image-Loader。 该库为异步图像加载,缓存和显示提供可重复使用的工具。它最初基于lazyloading项目,并且自那时以来大大地进行了重构和改进。

1

您需要确保在可能的情况下进行缩减采样,并且由于您使用的是ListView,因此您还可能通过将图像缓存到内存或磁盘中来获益。

这里阅读最佳做法:Displaying Bitmaps Effeciently

如果您正在寻找实施的最佳实践考虑使用助手库加载您的图像更简单的方法。这里是一个很好的一个:Android-Universal-ImageLoader

1

Outof的MemoryError

时内存的请求时使用可用的平台资源不能满足

抛出。这样的请求可以由正在运行的应用程序或VM的内部功能来完成。

因此,您的映像太大,超过了VM分配的内存。缩小图像或使用下面的库。

您可以使用

  1. 懒列表

  2. 通用图像装载机

懒列表是从SD卡或者使用FOMR服务器URL的图像延迟加载。这就像按需加载图像。

图像可以缓存到本地SD卡或手机mmeory。网址被认为是关键。如果密钥存在于sdcard中,则显示来自SD卡的图像,否则通过从服务器下载显示图像并将其缓存到您选择的位置。缓存限制可以设置。您也可以选择自己的位置来缓存图像。缓存也可以被清除。

而不是用户等待下载大图像,然后显示懒惰列表按需加载图像。由于缓存的图像区域可以离线显示图像。

https://github.com/thest1/LazyList。懒惰列表

在你getview

imageLoader.DisplayImage(imageurl, imageview); 

ImageLoader的显示方法

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); 
} 

} 到懒惰列表的替代方案是通用图像装载机

https://github.com/nostra13/Android-Universal-Image-Loader。它基于Lazy List(基于相同原理)。但它有很多其他配置。我宁愿使用通用图像加载程序因为它给你更多的配置选项。如果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()

ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
    imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options 

你可以用其他选项配置,以满足您的需求。

这是作者的话。(直接从下主题有用信息的链接)

如果经常使用的通用图像装载机旁边(全部或几个,然后尝试获得的OutOfMemoryError在你的应用程序 ):

  1. 减少配置(.threadPoolSize(...))中的线程池大小。建议使用1 - 5。 在显示选项中使用.bitmapConfig(Bitmap.Config.RGB_565)。 RGB_565中的位图比ARGB_8888消耗的内存少2倍。

  2. 在配置中使用.memoryCache(新的WeakMemoryCache())或者在显示选项中全部禁用内存缓存(不要调用.cacheInMemory())。

  3. 在显示选项中使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)。或者尝试.imageScaleType(ImageScaleType.EXACTLY)。

  4. 避免使用RoundedBitmapDisplayer。它会创建一个带有ARGB_8888配置的新Bitmap对象,用于在工作中显示。

随着延迟加载/通用图像装载机可以使用为平滑滚动和性能视图持有人。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html