在TypedArray中使用recycle()方法有什么用处

时间:2011-08-31 05:21:50

标签: android

我创建了一个GalleryViewImageView,当在图库中点击一个项目时,它会显示更大的图像。我使用以下代码来实现ImageAdapter

public ImageAdapter(Context c)
{
    context = c;
    TypedArray a = obtainStyledAttributes(R.styleable.gallery1);
    itemBackground = a.getResourceId(R.styleable.gallery1_android_galleryItemBackground, 0);    
    a.recycle();    
}

当我删除语句a.recycle()时,没有任何变化且应用程序像以前一样正常运行,但在我读到的任何地方都必须回收typedArray。当我的应用程序运行方式没有变化时,recycle()方法的用途是什么?

4 个答案:

答案 0 :(得分:33)

这一点类似于用C语言清除指针的想法(如果你熟悉它)。它用于使与a相关联的数据准备好进行垃圾回收,因此当不需要时,内存/数据不会低效地绑定到a。阅读更多here

重要的是要注意,除非你真的重复使用“a”,否则这不是必需的。如果不再使用该对象,GC应自动清除此数据。但是,TypedArray不同的原因是TypedArray有其他内部数据必须返回(StyledAttributes)到TypedArray以供日后重用。阅读here

答案 1 :(得分:6)

recycle()导致分配的内存立即返回到可用池,并且在垃圾收集之前不会停留。此方法也适用于Bitmap

答案 2 :(得分:0)

回收基本上意味着......免费/清除与相应资源相关的所有数据。 在Android中,我们可以找到Bitmap和TypedArray的回收。

如果你检查两个源文件,那么你可以找到一个布尔变量“mRecycled”,它是“false”(默认值)。调用回收时,它被指定为“true”。

所以,现在,如果你检查那个方法(两个类中的循环方法),那么我们可以观察到他们正在清除所有的值。

这里有参考方法。

Bitmap.java:

    public void recycle() {
    if (!mRecycled && mNativePtr != 0) {
        if (nativeRecycle(mNativePtr)) {
            // return value indicates whether native pixel object was actually recycled.
            // false indicates that it is still in use at the native level and these
            // objects should not be collected now. They will be collected later when the
            // Bitmap itself is collected.
            mBuffer = null;
            mNinePatchChunk = null;
        }
        mRecycled = true;
    }
}

TypedArray.java

    public void recycle() {
    if (mRecycled) {
        throw new RuntimeException(toString() + " recycled twice!");
    }

    mRecycled = true;

    // These may have been set by the client.
    mXml = null;
    mTheme = null;
    mAssets = null;

    mResources.mTypedArrayPool.release(this);
}

这一行

mResources.mTypedArrayPool.release(this);

将从默认值为5的SunchronisedPool中释放typedArray。 所以你不应该再次使用相同的typedArray,因为它被清除了。

一旦TypedArray的“mRecycled”为真,那么在获取其属性时,它将抛出RuntimeException,说“无法调用循环实例!”。

同样的行为也包括Bitmap。 希望它有所帮助。

答案 3 :(得分:0)

由于其使用已结束[after initializing our local attributes],因此我们将其回收回资源池

  

简单