2012-08-14 12 views
5

So che prima dell'API 10 di Android, era importante chiamare recycle() per Bitmap s che non sono più utilizzati, poiché i dati grezzi effettivi sono memorizzati nella memoria nativa.Che cosa fa chiamare bitmap.recycle() su API 11+?

Tuttavia, come di API 11, Bitmap s sono memorizzati nel mucchio, quindi la mia domanda è:

è ancora necessario per chiamare recycle() su Bitmap s se l'API è abbastanza grande (almeno 11)? Che cosa fa se lo chiamo su tale API?

+0

Quando si dice "era importante chiamare recycle() prima dell'API 10" vuol dire che se non lo si fa, la memoria non verrà mai liberata? I documenti ufficiali dicono che è "raccomandato" ma se alloca la bitmap nella memoria nativa non capisco come possa essere liberato senza una chiamata a recycle(). – Tiago

+0

@Tiago È possibile guardare questa lezione: https://www.youtube.com/watch?v=_CruQY55HOk#t=656. Le bitmap occupavano davvero poco spazio nell'heap, ma i loro dati pixel non lo erano (pur essendo parte del meccanismo OOM dell'heap), quindi il GC non sapeva quanto fosse buono/cattivo la situazione, e se non fosse stato t attivato durante la creazione di più bitmap, è possibile ottenere facilmente OOM. Questo è il motivo per cui è importante chiamare "recycle", in modo che pulisca le bitmap il prima possibile (perché il GC non ha funzionato bene). –

+0

Ah, capisco. Questo spiega molto. È piuttosto strano che l'eccezione OutOfMemory contenga sia l'heap che la memoria nativa mentre il GC guarderebbe solo l'heap. Una volta da Honeycomb + i dati dei pixel delle bitmap sono anche nell'heap, allora il GC può fare il suo lavoro giusto. Che casino, hehe! Grazie per il chiarimento! – Tiago

risposta

5

La documentazione ufficiale dice che recycle() ora è una chiamata avanzata, quindi se vuoi liberare la tua bitmap puoi semplicemente scrivere qualcosa come bitmap = null e GC si prenderà cura di tutto il resto.

+0

io vedo . quindi riciclare ne libererà ancora il ricordo subito? –

+0

Sì, il riciclo libererà la memoria non guardando GC, quindi devi stare attento con questa chiamata. – s0nicYouth