Android Drawables:outofmemoryerror VERSUS“无法绘制可回收的位图”错误

时间:2013-03-08 00:02:28

标签: java android android-layout

我已经阅读了大量有关这两个错误的帖子,似乎无法找到适合我的解决方案。 我有动物的基本列表视图活动。当您单击列表中的某个项目时,它会打开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对此感到满意。

2 个答案:

答案 0 :(得分:3)

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

  

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

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

总的来说,我认为您最好看一下Android培训课程,告诉您如何display Bitmaps efficiently

答案 1 :(得分:0)

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

编辑:WOOPS!我完全忘记了如果你将drawable设置为null,那么你就无法检索你想要回收的位图。尝试先将其分配给变量,然后再循环它。