2013-03-19 8 views
5

Per prima cosa, so che c'è un sacco di post correlati, ho letto un sacco di loro, nessuno di loro ha aiutato e io sono a corto di idee :)Android errore OutOfMemory & LRUCache

Quindi sono in via di sviluppo un'app per Android (sdk versione 14+) che utilizza molte immagini (per pulsanti, loghi, visualizzazione di molte immagini e così via). La dimensione media dell'immagine è 120kb + - 100kb

Come dice il titolo, sto ottenendo errore OutOfMemory. Inizialmente ho aggiunto l'origine dell'immagine a ImageViews in xml o programmaticamente usando setImageResource. Presto l'app ha iniziato a bloccarsi a causa dell'errore OutOfMemory. Quindi ho letto questo tutorial (http://developer.android.com/reference/android/util/LruCache.html) e ho implementato LruCache come dice. Ho aggiunto bitmap a lrucache e poi ho usato il metodo get per impostare bitmap su imageview.

Nel metodo onDestroy dell'attività, chiamo il metodo evictAll su lrucache e imposto lrucache su null. Quindi presumo, il ricordo è liberato allora.

Tuttavia, il problema persiste ancora, quando passo attraverso un paio di attività, l'app si blocca.

aiuto molto apprezzato :)

+0

Hai provato a usare la cache del disco? http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – Neil

+0

Stai mettendo tutte le tue immagini nella cartella drawable? Se poi provi a inserirli in diverse cartelle drawable-dpi in base alla densità del tuo dispositivo ... –

risposta

3

In base alla documentazione che supera la memoria VM massima disponibile verrà generata un'eccezione OutOfMemory. Sembra che la cache dei bitmap superi la memoria virtuale disponibile.

Riciclare le bitmap quando non sono in uso.

bitmap.recycle(); 

When should I recycle a bitmap using LRUCache?. Dai un'occhiata alla risposta accettata da commonsware.

Credo che quando il LRUCache espelle l'immagine per far posto ad un altro, la memoria è non essere liberata. (Inviata da utente nel link qui sotto)

Non sarà, fino a quando la bitmap viene riciclato o raccolta rifiuti (risposta da commomsware).

http://www.youtube.com/watch?v=_CruQY55HOk. Parla di gestione della memoria, perdite di memoria e utilizzo di MAT Analyzer.

+0

Sto ancora cercando di risolvere il problema. Sto chiamando il metodo di riciclo su bitmap nel metodo entryRemoved della classe lrucache ma non risolve il problema. Ho pensato che avrebbe funzionato, perché aggiungo tutte le immagini necessarie alla cache nel metodo onCreate di attività. Le immagini vengono quindi utilizzate per tutta la durata dell'attività. –

+0

utilizza l'analizzatore mat per trovare e risolvere il problema – Raghunandan

+0

la mia app utilizza più memoria e l'heap continua ad aumentare e fornire OOM.?solution – GvSharma

1

State memorizzazione di tutte le immagini nel mucchio? Se è così, dovresti tenerli nella cache nella scheda SD o nella memoria interna e tenerne solo un mucchio nell'heap (un buon approccio è usare una cache LRU).

Se lo stai già facendo ... puoi scaricare lo strumento di analisi della memoria e eseguire il debug dell'utilizzo della memoria della tua app.

http://www.eclipse.org/mat/

Trattare con OutOfMemoryError può essere davvero doloroso.

Buona fortuna!

+0

grazie per la risposta, ma il fatto è che ho bisogno di tutte le immagini per tutta la durata dell'attività. Credo che alcune immagini rimangano nella memoria anche quando l'attività viene distrutta, perché l'errore si verifica solo quando sto "pedalando" attraverso un paio di attività (a volte l'errore si verifica relativamente presto, a volte no). –

4

Grazie ragazzi mi hai aiutato molto!

Quindi, se qualcuno naviga a questa domanda con lo stesso problema, ecco alcune linee guida:

  • chiamata .recycle() sulla bitmap quando non hai bisogno di più di loro.
  • uso Eclipse Memory Analyzer per trovare problemi
  • (deve) vedere il video this
  • here's come visualizzare le bitmap dal file .hprof
Problemi correlati