我创建了一个GalleryView
和ImageView
,当在图库中点击一个项目时,它会显示更大的图像。我使用以下代码来实现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()
方法的用途是什么?
答案 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
],因此我们将其回收回资源池
简单