This answer mi dice che chiamare il metodo recycle()
di un TypedArray consente di raccogliere dati inutili. La mia domanda è perché TypedArray ha specificamente bisogno di un metodo per essere raccolto dalla spazzatura? Perché non può semplicemente aspettare di essere raccolto come un normale oggetto?Perché un TypedArray dovrebbe essere riciclato?
9
A
risposta
5
Questo è necessario per la memorizzazione nella cache di porpora. Quando chiami recycle
significa che questo oggetto può essere riutilizzato da questo punto. Internamente TypedArray
contiene pochi array, quindi per non allocare memoria ogni volta che viene utilizzato TypedArray
, esso viene memorizzato nella classe Resources
come campo statico. Potete guardare il codice TypedArray.recycle()
metodo:
/**
* 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;
}
}
}
Così, quando si chiama recycle
l'oggetto TypedArray
è appena tornato alla cache.
2
@Andrei Mankevich Ho appena controllato la versione più recente di Android SDK, e sembra che ci siano alcune modifiche per riciclare(). Si prega di verificare i seguenti codici:
/**
* 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);
}
/** * Riciclare la TypedArray, di essere ri-usato da un chiamante in seguito. Dopo aver chiamato * questa funzione non deve mai toccare nuovamente la matrice tipizzata. */ public void recycle() { if (mRecycled) { throw new RuntimeException (toString() + "recycled twice!"); } mRecycled = true; // Questi potrebbero essere stati impostati dal client. mXml = null; mTheme = null; mResources.mTypedArrayPool.release (this); } – Sam003