android创建对象和内存

时间:2012-11-13 15:30:54

标签: android memory bitmap memory-leaks

如果我创建一个对象并将其分配给变量:

Obj obj1 = null;
obj1 = myFunction(params);

(这里myFunction创建一个复杂的对象)

后来我重新分配变量:

obj1 = myFunction(otherparams);   

在那一刻会发生内存泄漏,因为我没有销毁前一个对象吗?

以下是真实情况:

Bitmap bmp;
bmp = drawMyBitmap(3);
//... some code
bmp = drawMyBitmap(4);

这里会发生内存泄漏吗?

对于cource,我知道我必须调用bmp.recycle,但我不能这样做,因为真正的代码如下:

Bitmap bmp;
bmp = drawMyBitmap(3);
imageView.setImageBitmap(bmp);
//... some code
// if I try to do recycle here - I receive java.lang.IllegalArgumentException: Cannot draw recycled bitmaps
// But I need to recreate bitmap every some minutes
bmp = drawMyBitmap(4);
imageView.setImageBitmap(bmp);

那么,我如何回收位图并避免内存泄漏?

3 个答案:

答案 0 :(得分:1)

据我了解,您的问题是您无法回收您的Bitmap,因为它已被使用。 这很天真,所以也许这是错的,但这样做:

imageView.setImageBitmap(bmp);
//... some code
Bitmap tmp = bmp;
bmp = drawMyBitmap(4);
imageView.setImageBitmap(bmp);
tmp.recycle(); // As it's not anymore referenced by the ImageView, you can recycle the Bitmap safely

我没有测试它。提供反馈。

答案 1 :(得分:0)

在第一种情况下,您将释放第一个对象的引用,以便垃圾收集器将其销毁,由于新的引用,将第二个对象保留在内存中。

在第二种情况下,如果您将位图设置为ImageViews,则无法回收它们,因为视图不会有位图来绘制图像,它会向您抛出位图回收异常,因此您不会“泄漏” “要在内存中保留2位图。

如果需要,尝试使用位图选项创建它们以优化内存消耗。

答案 2 :(得分:0)

 Bitmap bmp;
 bmp = drawMyBitmap(3);
 imageView.setImageBitmap(bmp);
 //... some code
 // if I try to do recycle here - I receive java.lang.IllegalArgumentException: Cannot    draw recycled bitmaps
 // But I need to recreate bitmap every some minutes
 Bitmap temp = bmp;  //try this
 bmp = drawMyBitmap(4);
 imageView.setImageBitmap(bmp);
 temp.recycle();