0

我正在使用此链接中的延迟加载来从 url 设置图像,并且我有非常大的位图。在我的列表视图中有很多图像要加载,当我滚动列表视图 20-30 次时,它会出现内存不足的错误。如何,可以我解决了这个错误..?

4

4 回答 4

1

内存不足错误

当使用可用平台资源无法满足内存请求时引发。这样的请求可以由正在运行的应用程序或由 VM 的内部功能发出。

所以你的镜像太大了,超出了虚拟机分配的内存。缩小图像或使用以下库。

您可以使用

  1. 懒惰列表

  2. 通用图像加载器

延迟列表是使用 url 从 sdcard 或 fomr 服务器延迟加载图像。这就像按需加载图像。

图像可以缓存到本地sd卡或手机内存。Url 被认为是关键。如果密钥存在于 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。它基于惰性列表(工作原理相同)。但它还有很多其他配置。我更喜欢使用Universal Image Loader,因为它为您提供了更多配置选项。如果下载失败,您可以显示错误图像。可以显示带圆角的图像。可以缓存在磁盘或内存上。可以压缩图像。

在您的自定义适配器构造函数中

  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

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

这就是作者要说的。(直接来自主题有用信息下的链接)

如果您在使用 Universal Image Loader 的应用程序中经常遇到 OutOfMemoryError,那么请尝试下一个(全部或多个):

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

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

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

  4. 避免使用 RoundedBitmapDisplayer。它使用 ARGB_8888 配置创建新的位图对象,以便在工作期间显示。

除了延迟加载/通用图像加载器,您还可以使用视图持有者来实现平滑滚动和性能。

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

于 2013-04-04T13:27:07.397 回答
1

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

在此处阅读最佳实践:高效显示位图

如果您正在寻找一种更简单的方法来实现最佳实践,请考虑使用帮助程序库来加载图像。这是一个不错的:Android-Universal-ImageLoader

于 2013-04-04T13:17:33.643 回答
0

发生此错误,因为图像很大。您可以通过下面提到的方法有效地处理它。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

于 2013-04-04T13:17:08.483 回答
0

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

于 2013-04-04T13:17:24.993 回答