【问题标题】:Android and image recyclingAndroid和图像回收
【发布时间】:2013-02-18 17:02:35
【问题描述】:

图像回收在 Android 中究竟是如何工作的?

请允许我详细说明:

如果我有以下情况:

myBitmap = BitmapFactory.decodeResource(curView.getResources(), R.drawable.mypic);

并记录以下内容

Log.v("ImageStuff","Image is: "+myBitmap);

我得到以下结果:

Image is: android.graphics.Bitmap@(ResourceID here)

这很好,但是如果我做同样的事情但像这样调用回收

myBitmap = BitmapFactory.decodeResource(curView.getResources(), R.drawable.mypic);
myBitmap.recycle()

我得到与上面相同的结果。我以为调用回收会清除位图,因此它会记录为空?

另外,如果我有一个像这样采用位图的方法:

public void doStuff(Bitmap pic){

//Code here

}

如上创建我的位图并将其发送到 doStuff:

myBitmap = BitmapFactory.decodeResource(curView.getResources(), R.drawable.mypic);
doStuff(myBitmap);

如果我想回收图像,是否需要调用 myBitmap.recycle();以及 pic.recycle (在我完成后的 doStuff 方法中)。?

【问题讨论】:

    标签: android memory-management graphics bitmap recycle


    【解决方案1】:

    Bitmap 对象包含图像数据(在后台分配的像素值),它本身不是图像数据。所以,Bitmap 对象可以在recycle() 之后挂起,但是当您尝试处理数据时会抛出错误。

    当您或任何其他对象不再以任何方式使用 Bitmap 时,您调用 recycle()。您还可以设置myBitmap = null 让对象本身被垃圾回收。

    【讨论】:

    • 谢谢@User117 所以它只是一个指向图像数据的指针?在这种情况下,我是否只需要回收指向同一图像的两个实例之一,如果需要,是哪一个?还是没关系?或者我应该在两者上都调用回收? (如我上面的例子)
    • @Zippy 是的,因为两个变量都指向同一个对象,所以在任何变量上调用 recycle() 都会在该位图对象上调用 recycle()
    【解决方案2】:

    扩展 User117 的 cmets:

    1) 位图只是图像数据的容器。当您调用回收时,它会删除所有图像数据,但仍保留容器。

    2) 如果您将 Bi​​tmap 传递给仅传递对位图的引用的 doStuff 方法,则无需调用 recycle 两次,因为对象是相同的。如果您不再需要它,只需在调用 doStuff 后调用 myBitmap 上的回收。

    【讨论】:

    • 谢谢我现在明白了!
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 2015-02-17
    • 2011-12-22
    • 1970-01-01
    • 2015-01-08
    • 2012-10-07
    • 2012-07-20
    • 2012-08-09
    相关资源
    最近更新 更多