2012-03-21 22 views
6

Nella mia applicazione sto usando la galleria semplice e il coverflow entrambi ho la mia galleria di immagini coverflow sull'immagine ritoccata nel coverflow vengo reindirizzato alla prossima attività che contiene la galleria a schermo intero e posso persino scorrere la mia galleria a schermo intero; ma quando inserisco più quantità di immagini o immagini ad alta risoluzione nella mia app viene forzato a causa della dimensione Bitmap supera il budget VMCome svuotare o cancellare dinamicamente memoria heap nel mio codice

quindi voglio cancellare memoria heap ogni volta che finisco il mio flusso di copertura e la galleria così posso carica qualsiasi importo o qualsiasi immagine di risoluzione nella mia app quindi se qualcuno può aiutarmi ... Come cancellare/svuotare la memoria heap ogni volta che finisco la mia attività dinamicamente nel mio codice? Ho già provato riciclo e il metodo System.gc

+0

È possibile leggere le ricerche su ciò che romain ha detto sulla grafica e sulle bitmap. – JoxTraex

risposta

31

Non si può "cancellare il cumulo". la VM lo farà automaticamente quando i tuoi oggetti non saranno più referenziati.

Detto questo, le bitmap sono una cosa difficile in Android. C'è una memoria limitata e quando un'immagine viene decodificata in una bitmap può occupare molto più memoria rispetto al formato di immagine compressa stesso.

Non esiste una risposta semplice alla soluzione. Anche se fai tutto correttamente, potresti semplicemente rimanere senza memoria. Detto questo, ecco alcuni suggerimenti:

  1. Utilizzare Bitmap.release(). le bitmap sono speciali in quanto allocate nell'heap dello stack nativo (al contrario della VM). I javadoc sono un po 'confusi, affermando che normalmente non è necessario chiamare questo, ma nella mia esperienza questo "indizio" della VM che hai fatto con la memoria che supporta la bitmap è importante. MODIFICA: A partire da Android 3.0 (livello API 11), i dati dei pixel vengono memorizzati nell'heap Dalvik insieme alla bitmap associata.

  2. Carica bitmap nella memoria ridimensionato. Ecco un blog post sull'argomento. Si ottengono solo 24 MB di heap su alcuni dispositivi e un'immagine ad alta risoluzione potrebbe esaurire tutto ciò quando viene caricata in un oggetto bitmap. Non c'è modo di aggirare questo, quindi devi caricarlo in scala.

  3. Non chiamare System.gc() come ha detto un'altra risposta. Le persone che hanno sviluppato l'algoritmo GC sono più intelligenti di te e me; loro sanno quello che stanno facendo. Non otterrai mai un OOME quando c'è una memoria che può essere liberata attraverso un GC - il GC funzionerà sempre prima di darti un OOME.

  4. Questo suo ovvio, ma assicurarsi che non state tenendo riferimenti a immagini bitmap quando non sono necessari più.

  5. Infine, e questo fa schifo, Android non fa mucchio compattazione. Ecco un SO question pubblicato su di esso qualche tempo fa, senza una risposta soddisfacente. In poche parole, Android non compatta mai l'heap, così come la tua app continua a allocare pezzi grandi o anche di medie dimensioni per bitmap, finisci per ritrovarti in una situazione in cui, mentre non hai memoria, non c'è abbastanza contigua pezzo di memoria per la tua allocazione, e ottieni OOME. Il modo solo, come ho scritto nella mia domanda, è quello di uccidere il processo della app quando l'utente si chiude. Ciò rende l'avvio più lento la volta successiva, ma garantisce un nuovo heap. Non fraintendermi, non posso credere che sia la cosa giusta da fare, ma nessuno ha trovato una soluzione migliore.

+1

Buona spiegazione delle informazioni di romain +1. – JoxTraex

+0

questo non è "informazioni di romain". non so a cosa ti riferisci. –

+0

È uno dei tecnici degli strumenti di interfaccia utente di Google, quello che hai appena detto è basicamente quello che ha detto. E il suo nome è maniglia è romainguy. – JoxTraex