【问题标题】:Android Load Many Images EfficientlyAndroid 高效加载大量图片
【发布时间】:2015-10-15 06:13:37
【问题描述】:

我在各种 Drawable 文件夹(Drawable-xhdpi、Drawable-mdpi 等)中有很多 PNG 图像。它们都相对较小(最多 10KB),但有一次我需要加载大约 50 个他们在屏幕上。当我这样做时,它会导致 OutOfMemoryError。理想情况下,我希望能够通过简单地调用一次 setContentView 来加载这些图像(内容视图有一堆 ImageViews,它们的 src 属性已经设置为相应的图像)。这就是我现在正在做的事情,但是由于内存错误,这当然不起作用。除了缩小图片大小,还有什么办法可以防止OutOfMemoryError?

【问题讨论】:

  • 你可以使用一些高效的图片加载库,比如毕加索:square.github.io/picasso
  • 您是一次性加载它们还是回收它们?看看这个 - developer.android.com/training/material/lists-cards.html
  • 你可以通过在应用标签下的清单文件中写入“android:largeHeap="true"”来增加堆的大小
  • atuter- 我试过了,但它导致在屏幕下半部分加载图像时出现明显的延迟。理想情况下,我希望能够在显示任何图像之前以某种方式在背景中加载所有图像。毕加索支持这样的东西吗?此外,它需要在运行时单独设置每个图像,而不是在 XML 文件中,对吧?
  • Amos- 看起来它可能会有所帮助,但我不需要这些类提供的滚动功能;我希望所有内容都显示在同一屏幕上。我不确定是否有更合适的方法来做到这一点,但我肯定会尝试这个选项。谢谢!

标签: java android memory imageview


【解决方案1】:

避免一次加载这么多图片, 相反,您可以将它们加载到 GridView 中,如 here 所述。

使用PicassoGridView 来提高内存效率

public View getView(int position, View convertView, ViewGroup container) {
   ImageView imageView;
   if (convertView == null) { // if it's not recycled, initialize some attributes
      imageView = new ImageView(mContext);
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
      imageView.setLayoutParams(new GridView.LayoutParams(
      LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
      } else {
         imageView = (ImageView) convertView;
      }
   // Load image into ImageView "using Picasso"         
   Picasso.with(mContext).load(imageResIds[position]).into(imageView);
   return imageView;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2019-09-08
    • 2015-02-19
    相关资源
    最近更新 更多