如果我创建一个对象并将其分配给变量:
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);
那么,我如何回收位图并避免内存泄漏?
答案 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();