Innanzitutto, assicurarsi di non caricare bitmap più grandi del necessario:
Load a Scaled Down Version into Memory.
Poi, prima di provare largeHeap
, cercano di liberare la memoria rapidamente da soli:
Se si chiama bitmap.recycle();
non appena si è certi di non usare di nuovo una bitmap, quindi la maggior parte di quel la memoria bitmap sarà immediatamente liberata. (Quando il GC fa il giro, tutto ciò che rimane è un oggetto minuscolo.)
sulle versioni più recenti di Android, ci sono alternative (invece di recycle
) che possono essere più efficaci:
Managing Bitmap Memory
Personalmente, io uso ancora recycle
spesso, specialmente se potrei essere il caricamento di un diverso dimensione immagine, quindi non può reuse
quello esistente. Inoltre, trovo più semplice codificare lo "scarico" dei vecchi media separatamente dal "caricamento" dei nuovi media, quando si passa a un altro frammento o attività:
Come lasciare il vecchio frammento, tutte le vecchie immagini bitmap I recycle
(quindi, se raggiungibile da un campo statico, impostare su null
).
La regola generale per se utilizzare largeHeap
, è quello di considerare che dopo che hai provato modi alternativi per ridurre l'utilizzo della memoria.
Codice vostra applicazione in modo da potrebbe girarlo di nuovo, e ancora correre.
Ad esempio, monitor your memory usage e carico "ridimensionati" bitmap se la memoria è stretto. L'utente noterà davvero se una determinata immagine non è in risoluzione "retina" del proprio dispositivo?
Oppure, se si tratta di un dispositivo più vecchio, più lento, sarà largeHeap rendere la vostra app non risponde/a scatti? In tal caso, è possibile eliminare ulteriormente la risoluzione o mostrare un numero inferiore di bitmap contemporaneamente?
Porta la tua app a funzionare in tutte le circostanze, senzalargeHeap
[con le tecniche sopra menzionate]. NOTA: è possibile eseguire il "force-test" sulla memoria limitata allocando alcuni bitmap "fittizi" e conservare i riferimenti nei campi globali, in modo che non vengano liberati.
ora siete in grado di valutare il trade-off, in quanto colpisce la vostra applicazione:
Quando non accende largeHeap
in poi, utilizzare la vostra applicazione pesantemente - sono lì luoghi dove è ora "più lenta", o le animazioni "balbettano" o altrimenti sembrano meno lisce? ASSICURARSI DI ESEGUIRE SU ALMENO UN DISPOSITIVO ANZIANO E SU UN DISPOSITIVO HIGH_RESOLUTION. A causa dell'heap più grande, potresti vedere tempi lunghi del GC.
OPPURE potresti concludere che largeHeap
sta funzionando bene per te, e ora puoi tranquillamente dire che è la scelta migliore nella tua circostanza.
BTW, se si chiama 'bitmap.recycle();' appena si è SICURO di non utilizzare nuovamente una bitmap, la maggior parte della memoria di tale bitmap verrà immediatamente liberata. (Quando il GC si avvicina, tutto ciò che rimane è un piccolo oggetto.) – ToolmakerSteve