【问题标题】:Android Drawables: outofmemoryerror VERSUS "cannot draw recycled bitmaps" errorAndroid Drawables:outofmemoryerror VERSUS“无法绘制回收位图”错误
【发布时间】:2013-03-08 00:02:27
【问题描述】:

我已经阅读了大量关于这两个错误的帖子,但似乎找不到适合我的解决方案。 我有一个基本的动物列表视图活动。当您单击列表中的某个项目时,它会打开 AnimalViewActivity 并在 ImageView 中显示一个简单的 png 图像。

这是我为 ImageView 设置图像的地方:

public void getImage() {

    String imageName = myService.yourAnimals.get(key).getType();
    System.out.println(imageName);

    Resources res = getResources();
    int resourceId = res.getIdentifier(imageName, "drawable", getPackageName() );
    Drawable drawable = res.getDrawable( resourceId );
    image.setImageDrawable( drawable );
}

然后当我离开 AnimalViewActivity 返回 listview 活动时,我这样做:

@Override
protected void onDestroy() {
    super.onDestroy();
    //((BitmapDrawable)image.getDrawable()).getBitmap().recycle();
    image.getDrawable().setCallback(null);
    //System.gc();
    System.out.println("Destroy image!");
}

如果我取消注释 recycle() 行,我会收到“无法绘制回收位图”错误。 如果我让它保持原样,我会得到 bitmapfactory 的 outofmemoryerror。

java.lang.IllegalArgumentException:无法绘制回收位图 或者 java.lang.OutOfMemoryError android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

在我打开 ViewAnimalActivity 大约 20 次并且应用程序崩溃后,就会出现这些错误之一。 唯一似乎永远有效的是 System.gc() ,但我知道这不是一个好的解决方案。

我在android4.1中测试,但是minSDK设置为android3.0

我读到位图回收的 javaVM 错误在 3.0 中已修复?

由于某种原因,如果没有显式调用 gc,垃圾收集的速度不够快。这些图片很小,大多在 100-300kB 之间。

有什么想法吗?

编辑: 似乎更快乐
image.setImageDrawable(null);

我想我之前在 Android2.2 上仍然设置它时尝试过,但到目前为止 Android3.0 对它很满意。

【问题讨论】:

  • 需要更多代码请添加活动代码
  • 我没有提到也没有在应用程序的其他任何地方使用图像或 imageView。我所做的只是设置一个图像,然后在不再需要它时尝试将其删除。
  • 发布你的 logcat 看看你在哪里得到了 OutOfMemoryError

标签: java android android-layout


【解决方案1】:

The documentation for recycle() 明确声明它用于“高级用途”。实际上,将引用设置为 null 更为重要。

这是一个高级调用,通常不需要调用,因为 正常的 GC 进程将在没有更多内存时释放此内存 对此位图的引用。

此外,还可以在绘制 Bitmap has been recycled 之前查看它。 (发布您的 logcat 以查看您遇到错误的位置。您可以添加代码以验证 Bitmap 是否已被回收并重新加载)。

总的来说,我认为你最好看看 Android 培训课程,它会告诉你如何display Bitmaps efficiently

【讨论】:

    【解决方案2】:

    为什么不先尝试将drawable设置为null,然后再循环使用呢?问题可能是因为当你回收它时drawable仍然在图像上,从而导致“无法绘制回收位图错误”。如果您首先将其设置为 null,从而将实际的 ImageView(或您正在使用的任何内容)设置为 null,然后将其回收,这可能会解决您的问题。

    编辑:哇!我完全忘记了如果您将可绘制对象设置为空,那么您将无法检索您尝试回收的位图。尝试先将它分配给一个变量,然后再循环它。

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 2013-08-31
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多