1

我创建了如下所示的位图,

// create bitmap in the below line Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.googlelogo320x480); 我已将其设置为 ImageView。

我的问题是: 1> 我需要在上面的位图上显式调用 Bitmap.recycle() 吗?2> 如果是,那么我应该什么时候打电话?我尝试在第 3 行之后立即调用它,即将位图设置为 ImageView 之后,但是我得到一个异常,即 Canvas 试图绘制一个回收的对象。3> 如果在我的代码中从未在位图上调用 recycle(),是否会导致内存泄漏?PS:我正在研究ICS或更高版本。

4

3 回答 3

4

在这种特殊情况下,不,您不应该调用 recycle(); 完成ImageView后将调用 recycle()。这已经有一段时间了,ICS 没有采取任何措施来改变这一事实。

当您的代码处理完图像后,您需要调用 recycle()。例如,如果您对一个图像应用 10 个过滤器并在每一步生成一个新的位图,那么您应该在每一步之后对旧位图调用 recycle()。

也就是说,您不能同时拥有无限数量的位图,尤其是大型位图。那是你需要聪明并动态加载/卸载的时候。

于 2012-10-27T14:41:43.810 回答
2

不调用 recycle()不会导致内存泄漏,但可能会导致你的应用程序超出内存限制并爆炸,请参阅下面的应用程序是否符合条件:

  1. 如果您只对 ICS 及更高版本感兴趣,则无需担心调用 recycle(),因为 Bitmap 的实际支持数据存储在 Dalvik 控制的内存中。因此,只要您不保留对 Bitmap 的引用,Dalvk 应该能够毫无问题地对其进行 GC。
  2. 即使您希望支持 Android 2.3 或更早版本,Bitmaps最终也会发布,因此如果您的应用程序不是 Bitmap 密集型的,您也不必担心。
  3. 但是,如果您支持 Android 2.3 或更早版本,并且使用大量位图,那么您应该在完成后立即回收位图。
于 2012-10-27T14:18:17.913 回答
0

试试这个

if (myBitmap != null) {
    myBitmap.recycle();
    myBitmap = null;
}
Bitmap original = BitmapFactory.decodeFile(myFile);
myBitmap = Bitmap.createScaledBitmap(original, displayWidth, displayHeight, true);
original.recycle();
original = null;
于 2012-10-27T14:09:58.443 回答