如何有效地回收按照下面的代码创建的位图?

时间:2012-10-27 14:05:37

标签: android bitmap recycle

我创建了如下的Bitmap,

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

我的问题是: 1 GT;我是否需要在上面的Bitmap上显式调用Bitmap.recycle()? 2 - ;如果是,那么我该什么时候打电话呢?我已经尝试在第3行之后立即调用它,即在将位图设置为ImageView之后,但是我得到Canvas尝试绘制回收对象的异常。 3 GT;如果我的代码中的Bitmap永远不会调用recycle(),那会是内存泄漏吗? P.S:我正在ICS或以上工作。

3 个答案:

答案 0 :(得分:4)

在这种特殊情况下,不,你不应该调用recycle(); ImageView完成后会调用recycle()。这已经有一段时间了,ICS没有改变这一事实。

当代码完成图像后,您需要调用recycle()。例如,如果您将10个过滤器应用于一个图像并在每个步骤上生成新的位图,则应该在每个步骤之后调用旧位图上的recycle()。

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

答案 1 :(得分:2)

不调用recycle()将导致内存泄漏,但可能导致您的应用超出内存限制并爆炸,请参阅下文以查看您的应用是否合格:

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

答案 2 :(得分:0)

试试这个

if (myBitmap != null) {
    myBitmap.recycle();
    myBitmap = null;
}
Bitmap original = BitmapFactory.decodeFile(myFile);
myBitmap = Bitmap.createScaledBitmap(original, displayWidth, displayHeight, true);
original.recycle();
original = null;