2013-03-21 7 views
9

mia app scopo principale è quello di visualizzare immagini in seguito la moda come mostrato nella immagineAndroid Bitmap.createScaledBitmap getta java.lang.OutOfMemoryError per lo più su Jelly Bean 4.1

enter image description here

private void setSelectedImage(int selectedImagePosition) 
{ 

    BitmapDrawable bd = (BitmapDrawable) drawables.get(selectedImagePosition); 
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false); 
    selectedImageView.setImageBitmap(b); 
    selectedImageView.setScaleType(ScaleType.FIT_XY); 

} 

codice dettagliate possono essere trovare here

viene generata un'eccezione alla riga seguente

Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false); 

La funzione precedente è denominata da onItemSelected. ** L'app funziona ancora correttamente su 2.2 e 2.3, ma genera un'eccezione immediata su 4.1 Il codice sopra funziona bene, ma genera un'eccezione successiva. Non ho mai visto crash in 2.2 e 2.3, ma si blocca immediatamente in 4.1 C'è qualche differenza importante nella gestione della memoria in Jelly Bean? **:

java.lang.OutOfMemoryError 
AndroidRuntime(2616): at android.graphics.Bitmap.nativeCreate(Native Method) 
AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:640) 
AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:586) 
AndroidRuntime(2616): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466) 
AndroidRuntime(2616): at com.rdx.gallery.GalleryDemoActivity.setSelectedImage(GalleryDemoActivity.java:183) 
+0

Quali sono le dimensioni e la larghezza della bitmap? –

+0

bitmap width e height è 363X387 – RDX

+0

Penso che il problema sia selezionatoImageView.setScaleType (ScaleType.FIT_XY); –

risposta

13

http://www.youtube.com/watch?v=_CruQY55HOk. Dopo eorid 3.0 i bitmap bitmap vengono memorizzati nell'heap. Sembra che tu stia superando le dimensioni della memoria heap. Solo perché l'app richiede un heap di grandi dimensioni, non utilizzare un heap di grandi dimensioni. Più la dimensione dell'heap, più regolari raccolte di dati inutili. Il video ha una buona spiegazione sull'argomento.

Ricicla anche i bitmap quando non sono in uso. Le raccolte di dati inutili nell'heap vengono contrassegnate e spazzate via, quindi quando si riciclano le immagini bitmap la memoria è libera. Quindi le dimensioni del tuo heap non cresceranno e esauriranno la memoria.

bitmap.recycle(); 

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html. Documentazione sul caricamento efficiente di bitmap. Dai un'occhiata al caricamento della versione ridotta in memoria.

A parte questo è possibile utilizzare Universal Image Loader. https://github.com/nostra13/Android-Universal-Image-Loader.

https://github.com/thest1/LazyList. Caricamento pigro delle immagini.

Entrambi utilizzano la memorizzazione nella cache.

+0

usando bitmap.recycle() di non in uso aiutato in modo acuto. – RDX

+0

ha risolto il tuo problema ?? – Raghunandan

+0

Bitmap.recycle utilizzato per bitmap inutilizzati. Niente più arresti anomali su quel modulo ora. Grazie – RDX

4

Si sta tentando di accedere a più memoria di quello che si ha. Tenta di utilizzare

BitmapFactory.Options opts=new BitmapFactory.Options(); 
     opts.inDither=false;      
     opts.inSampleSize = 8;     
     opts.inPurgeable=true;     
     opts.inInputShareable=true;    
     opts.inTempStorage=new byte[16 * 1024]; 

Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1) 
     , 65,65, true), 

un'occhiata anche a seguito i link per aumentare la memoria

http://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

Detect application heap size in Android

EDIT 1

tenta di utilizzare nostras downloader immagine, è possibile utilizzarlo per mostra l'immagine nella memoria locale. E gestisce la memoria molto bene ...

https://github.com/nostra13/Android-Universal-Image-Loader

+0

ho aggiornato la domanda, per favore ho un relook – RDX

+0

ho provato questo ma non ha funzionato né – RDX

+0

Pls guarda modifica, ti suggerisco di usare la libreria di nostras – Talha

25

E 'importante notare che seguente codice può causare eccezione:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
oldBitmap.recycle(); 

corretta è:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
if (oldBitmap!= bitmap){ 
    oldBitmap.recycle(); 
} 

perché documentazione dice:

Se la larghezza e l'altezza specificate sono il uguale alla larghezza attuale e all'altezza del btimap di origine, la bitmap di origine viene restituita e ora viene creata una nuova bitmap.

+0

Questo codice può ancora attivare eccezioni se la bitmap è già stata riciclata per qualsiasi motivo, è necessario aggiungerla al controllo: &&! OldBitmap.isRecycled() –

+0

In quale implementazione della classe Bitmap è necessario? Perché non in 5.1.0_r1, come il metodo lo controlla: "if (! MRecycled && mFinalizer.mNativeBitmap! = 0)" http://grepcode.com/file/repository.grepcode.com/java/ext/com .google.android/android/5.1.0_r1/android/grafica/Bitmap.java # Bitmap.recycle% 28% 29 – Malachiasz

Problemi correlati