我已经阅读了大量有关这两个错误的帖子,似乎无法找到适合我的解决方案。 我有动物的基本列表视图活动。当您单击列表中的某个项目时,它会打开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对此感到满意。
答案 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,那么你就无法检索你想要回收的位图。尝试先将其分配给变量,然后再循环它。