我使用此代码测试了TypedArray
recycle,期望根据文档获得运行时异常,但我没有得到。
循环
在API级别1中添加 void recycle()重新使用TypedArray 被后来的呼叫者重用。调用此功能后,您不能 再次触摸打字阵列。
如果TypedArray已被回收,则抛出RuntimeException。
public TimePickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TimePickerPreference, 0, 0);
initTimePickerPreference(a);
a.recycle();
}
protected void initTimePickerPreference(TypedArray a) {
if (a != null)
try {
setTitle(a.getString(R.styleable.TimePickerPreference_android_title));
mSummary = a.getString(R.styleable.TimePickerPreference_android_summary);
mDefaultValue = a.getString(R.styleable.TimePickerPreference_android_defaultValue);
} finally {
a.recycle();
}
...
}
我使用Android Studio调试程序跟踪代码并且它经历了a.recycle()
次调用,而在变量窗格a
中未进行null
我进行此测试的原因是因为我不能100%确定是否可以在a.recycle()
创建a
的范围内调用 public TimePickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TimePickerPreference, 0, 0);
initTimePickerPreference(a);
a.recycle();
a.recycle();
}
protected void initTimePickerPreference(TypedArray a) {
if (a != null)
try {
setTitle(a.getString(R.styleable.TimePickerPreference_android_title));
mSummary = a.getString(R.styleable.TimePickerPreference_android_summary);
mDefaultValue = a.getString(R.styleable.TimePickerPreference_android_defaultValue);
} finally {
a.recycle();
a.recycle();
}
...
}
。
我进一步重复了回收电话
RunTimeException
仍然没有$('#details-1').modal('show')
。
这是一个错误吗? 我使用Android IceCreamSandwich版本(API 15)在AVD模拟设备上运行它。
答案 0 :(得分:1)
Here's API {的实施TypedArray#recycle()
:
public void recycle() {
synchronized (mResources.mTmpValue) {
TypedArray cached = mResources.mCachedStyledAttributes;
if (cached == null || cached.mData.length < mData.length) {
mXml = null;
mResources.mCachedStyledAttributes = this;
}
}
}
Here's API 25的实施:
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);
}
显然,docs说明了最新API的实现,并且您正在使用API 15运行您的应用程序。