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);
}
Problemi correlati
- 1. Perché questo non dovrebbe essere compilato?
- 2. Perché una funzione virtuale dovrebbe essere privata?
- 3. Perché la classe Singleton dovrebbe essere sigillata?
- 4. Javascript TypedArray performance
- 5. Perché la chiamata # dell'applicazione dovrebbe essere lenta?
- 6. metodo GetResourceId di TypedArray
- 7. Perché dovrebbe essere (ogni? Stringa? []) Vero?
- 8. Perché dovrebbe @@ class_variables essere evitato in Ruby?
- 9. Dovrebbe essere smaltito un UdpClient?
- 10. Dovrebbe essere in un namespace?
- 11. Perché dovrebbe aspettare() sempre essere chiamati all'interno di un ciclo
- 12. Dove dovrebbe essere Android.mk?
- 13. Un temporizzatore C++ dovrebbe essere costante?
- 14. dovrebbe essere chiuso Class.getResourceAstream?
- 15. Cosa dovrebbe essere hadoop.tmp.dir?
- 16. Un tipo dovrebbe essere solo in movimento, solo perché la copia può essere costosa?
- 17. Dove dovrebbe essere un repository Subversion?
- 18. Quando dovrebbe essere usato un memoryview?
- 19. GCC - non dovrebbe essere emesso un avviso?
- 20. Perché l'archivio eventi dovrebbe essere sul lato scrittura?
- 21. java: perché non dovrebbe essere permesso di sfuggire al costruttore?
- 22. Perché Flask non dovrebbe essere distribuito con il server integrato?
- 23. Perché dovrebbe essere usato Homebrew per installare Python?
- 24. Perché il modello di osservatore dovrebbe essere deprecato?
- 25. Tabella hash: perché la dimensione dovrebbe essere in primo piano?
- 26. Questo bug dovrebbe essere risolto?
- 27. Perché l'immagine TCPDF è più piccola di quanto dovrebbe essere?
- 28. Perché la mappa dovrebbe essere molto più veloce di unordered_map?
- 29. Perché una dichiarazione enum dovrebbe essere marcata const?
- 30. WCF cosa dovrebbe essere endpointConfigurationName?
/** * 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