【问题标题】:ImageAdapter and ListView (java.lang.OutOfMemoryError: bitmap size exceeds VM budget)ImageAdapter 和 ListView(java.lang.OutOfMemoryError:位图大小超出 VM 预算)
【发布时间】:2010-06-15 23:34:20
【问题描述】:

我正在使用 ListView 来显示我通过 ImageAdapter 类提供的图像。 它在我的设备上运行良好(以及在我测试过的许多其他设备上),但不知何故,当我使用模拟器并且我长按向上/向下按钮时 - 我在 10 后收到 outOfMemory 错误-15 秒。

我尝试清除缓存、取消缓存等 - 没有任何帮助。

我知道这种崩溃非常罕见(我无法在任何“真实”设备上重现它),但我可以在 DDMS 上看到“GC freed”在长按期间变得越来越大,我找不到清除它们的方法。

我们将不胜感激,Tnx。

【问题讨论】:

    标签: android out-of-memory


    【解决方案1】:

    您应该使用 inSampleSize 选项进行解码以减少内存消耗。 Strange out of memory issue while loading an image to a Bitmap object

    另一个选项 inJustDecodeBounds 可以帮助您找到正确的 inSampleSize 值http://groups.google.com/group/android-developers/browse_thread/thread/bd858a63563a6d4a

    您还应该考虑使用 inPurgeable 选项 http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPurgeable。它允许系统释放内存以避免 OutOfMemory。

    【讨论】:

      【解决方案2】:

      几分钟前我刚刚遇到了这个问题。我通过更好地管理我的 listview 适配器解决了这个问题。我认为这是我使用的数百个 50x50px 图像的问题,结果我试图在每次显示该行时放大我的自定义视图。只需通过测试来查看该行是否被夸大,我就消除了这个错误,并且我使用了数百个位图。这实际上适用于 Spinner,但基本适配器对 ListView 的工作方式完全相同。这个简单的修复也大大提高了适配器的性能。

      @Override
      public View getView(final int position, View convertView, final ViewGroup parent) {
      
          if(convertView == null){
              LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              convertView = inflater.inflate(R.layout.spinner_row, null);
          }
      ...
      

      【讨论】:

        【解决方案3】:

        我在我的 ListView 中遇到了同样的问题。正如 Fedor 所描述的那样,我可以通过缩放图像并使用 inPurgeable 来减少下载的内存占用。在此处查看代码:How do I scale a streaming bitmap in-place without reading the whole image first?

        【讨论】:

          猜你喜欢
          • 2012-08-19
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 2010-12-29
          相关资源
          最近更新 更多