This answer teilt mir mit, dass das Aufrufen der recycle()
-Methode eines TypedArray es ermöglicht, dass Garbage Collected gesammelt wird. Meine Frage ist, warum TypedArray benötigt speziell eine Methode, um Müll zu sammeln? Warum kann es nicht einfach darauf warten, Müll gesammelt zu werden wie ein normales Objekt?Warum sollte ein TypedArray recycelt werden?
9
A
Antwort
5
Dies ist für die Zwischenspeicherung erforderlich. Wenn Sie recycle
aufrufen, bedeutet dies, dass dieses Objekt von diesem Punkt aus wiederverwendet werden kann. Intern enthält TypedArray
nur wenige Arrays. Um nicht jedes Mal Speicher zuzuweisen, wenn TypedArray
verwendet wird, wird es in der Klasse Resources
als statisches Feld zwischengespeichert. Sie können an TypedArray.recycle()
Methode Code aussehen:
/**
* Give back a previously retrieved StyledAttributes, for later re-use.
*/
public void recycle() {
synchronized (mResources.mTmpValue) {
TypedArray cached = mResources.mCachedStyledAttributes;
if (cached == null || cached.mData.length < mData.length) {
mXml = null;
mResources.mCachedStyledAttributes = this;
}
}
}
Also, wenn Sie recycle
Ihr TypedArray
Objekt aufrufen wird gerade in den Cache zurück.
2
@Andrei Mankevich Ich überprüfe nur die neueste Version von Android SDK, und es scheint, es gibt einige Änderungen zu recyceln(). Bitte überprüfen Sie die folgenden Codes:
/**
* Recycle the TypedArray, to be re-used by a later caller. After calling
* this function you must not ever touch the typed array again.
*/
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;
mResources.mTypedArrayPool.release(this);
}
/** * Bereiten Sie die TypedArray, durch einen späteren Anrufer wiederverwendet werden. Nach dem Aufruf * dieser Funktion dürfen Sie das typisierte Array nicht mehr berühren. */ public void recycle() { if (mRecycled) { throw new Runtime (toString() + "recycelt zweimal!"); } mRecycled = wahr; // Diese wurden möglicherweise vom Client festgelegt. mXml = null; mTheme = null; mResources.mTypedArrayPool.release (this); } – Sam003