2012-12-10 15 views

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.

+1

/** * 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

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); 
} 
Problemi correlati