1

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

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

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

后来我重新分配了变量:

obj1 = myFunction(otherparams);   

在那一刻是否发生内存泄漏,因为我没有破坏以前的对象?

以下是真实情况:

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

这里会发生内存泄漏吗?

当然,我知道我必须调用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);

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

4

3 回答 3

1

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

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

我没有测试它。给予反馈。

于 2012-11-14T09:25:28.277 回答
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();
于 2012-11-14T09:40:53.080 回答
0

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

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

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

于 2012-11-13T15:45:50.940 回答