2

我有以下代码:

loadedImageDraggable.setBitmap(bitmap);
Log.v(TAG, "recycled image1 :"+bitmap);
Log.v(TAG, "recycled image2 :"+loadedImageDraggable.getBitmap());
bitmap.recycle();
bitmap = null;
Log.v(TAG, "recycled image3 :"+bitmap);
Log.v(TAG, "recycled image4 :"+loadedImageDraggable.getBitmap());

所以我在编写代码时所期望的是位图对象将从内存中删除。当我运行代码时,我实际得到的是这个日志跟踪:

recycled image1 :android.graphics.Bitmap@41afa8e0
recycled image2 :android.graphics.Bitmap@41afa8e0
recycled image3 :null
recycled image4 :android.graphics.Bitmap@41afa8e0

您可以在最后一行看到,仍然有这个位图对象,包裹在加载的ImageDraggable 中。由于对象是通过引用传递给方法的,所以我希望 java 在对象设置为 null 时清除对该位图对象的所有引用。我很困惑:/有人可以帮我解决这个问题吗?

4

2 回答 2

2

您有两个对同一个位图对象的引用。一个是bitmap另一个loadedImageDraggable 现在在里面,如果你设置bitmap为空,里面的引用loadedImageDraggable当然不会改变。它仍然指向您的 Bitmap@41afa8e0

于 2012-09-14T10:10:45.030 回答
1

在任何进一步的解释之前,我想给你一个一般性的概述回收是如何工作的。

这是定义,

public void recycle() 自:API 级别 1 bitmap.recycle() 释放与此位图关联的本机对象,并清除对像素数据的引用。这不会同步释放像素数据;如果没有其他引用,它只是允许它被垃圾收集。位图被标记为“dead” ,这意味着如果getPixels() 或 setPixels()被调用,它将抛出异常,并且不会绘制任何内容。此操作无法反转,因此只有在您确定位图没有进一步用途时才应调用它。这是一个高级调用,通常不需要调用,因为当没有更多对该位图的引用时,正常的 GC 进程将释放此内存。

在您的情况下,您仍然持有对位图对象的引用。但是调用了使位图可绘制 DEAD。

当你loadedImageDraggable通过 setBitmap(null) 取消你的。它将有资格获得 GC。

即使这样,GC 操作也依赖于几个条件,其中之一是资源饥饿。在那之前,你永远不知道它会被收集。希望这会让您有更好的理解。

于 2012-09-14T10:33:03.997 回答