2013-01-16 7 views
17

Ho un app Android con 3 acitivtys:Fuori errore di memoria, mentre le bitmap di carico

A1 - inizia -> A2 - inizia -> A3 - una volta terminato il suo processo: inizia -> A1

(in modo da non "finitura();". un'applicazione comincio prossimi activitys con "startActivity (..)," tutto il tempo dopo UserInteraction)

così c'è un ciclo in queste 3 attività. su ciascuna attività, i visualizzare le immagini 3-9, che si trova sulla scheda SD, che si carica con il mio seguente funzione:

try 
{ 
    Uri selectedImageURI = Uri.parse(strImagePath); 
    File imgFile = new File(getRealPathFromURI(selectedImageURI, c)); 
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
    ivTmp.setImageBitmap(myBitmap); 
}catch (Exception e) 
{ 
    return null; 
} 

Questa tutte le opere. ma a volte (dopo looping un paio di volte attraverso i miei activitys), la mia app si blocca ..

Logcat mi dice:

01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms 
01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation. 
01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main 
     java.lang.OutOfMemoryError 
     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502) 
     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355) 
     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785) 
     at android.content.res.Resources.loadDrawable(Resources.java:1965) 
     at android.content.res.Resources.getDrawable(Resources.java:660) 
     at android.widget.ImageView.resolveUri(ImageView.java:616) 
     at android.widget.ImageView.setImageResource(ImageView.java:349) 
     at <MyApp>.MyActivity$6.run(MyActivity.java:143) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5039) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
     at dalvik.system.NativeStart.main(Native Method) 

Qualcuno può dare i miei alcuni consigli su come gestire il crash? Forse perché le mie attività sono impostate come "in pausa" invece di chiuderle correttamente?

+1

prova a chiamare .recycle() sui tuoi bitmap in OnPause(). e caricarli in onResume() non onCreate(). – pumpkee

+0

è possibile farlo in un modo migliore? come se tutti i miei bitmap si trovassero in una finestra di dialogo lineare, quindi chiamare llMain.recycle() o qualcosa del genere? – Prexx

+0

È possibile creare un ArrayList a cui si aggiunge ogni bitmap che si carica e si ricicla in looping. Un'altra cosa generale: gioca con la dimensione del campione dell'immagine. Non so a cosa serve la tua app, ma per mostrare semplicemente la bitmap sullo schermo il più delle volte è ancora sufficiente campionarli e risparmiare memoria. Vedi: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – pumpkee

risposta

31

per soluzione rapida è possibile aggiungere

android:largeHeap="true" nel tag file manifesto

link here:

Affronto problema OOM per il mio tavolo in kindle e nook

Heap size (large) 
android:largeHeap="true" 

non specifica è menzionato per utilizzare heap più grande link here:

modificare: uso la tecnica di caching bitmap link here

+1

ho visto questo anche in un'altra domanda, non funzionerà. – Prexx

+1

Bitmap di cache mi hanno aiutato molto! Grazie! :) – Prexx

+1

Grazie. Quel androide: la bandiera di grandi dimensioni nel manifest ha risolto il problema per me. –

0

Si pretende molto androide distruggere immediatamente le attività quando non sono visibili all'utente, ma ci sono un certo numero di metodi del ciclo di vita che vengono chiamati a seconda dello stato corrente. Scopri http://developer.android.com/guide/components/activities.html#Lifecycle

Si potrebbe provare a finire le attività in onStop() o OnDestroy() in quanto questi sarà chiamato quando l'attività non è visibile e quando il sistema funziona, rispettivamente basso sulla memoria. :-)

+0

ho provato a finire le attività, ma come risultato, sono tornato un'attività .. esempio: im su A3 e voglio andare su A1: chiamo startIntent (A1) e finisco -> im su A2 ..:/ – Prexx

+0

Ok , quindi penso che se si esegue l'override di onStop() per ogni attività e si metta finish() all'interno di quel metodo che dovrebbe terminare quell'attività e rilasciare le risorse piuttosto che il sistema mantenendolo in memoria una volta avviata l'attività successiva. Assicurati che il finish() non stia terminando l'attività corrente. – Broo

0

Ciò è dovuto alla elevata risoluzione dell'immagine è necessario scalare la bitmap utilizzare il seguente codice

Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

    int h = 100; // height in pixels 
    int w = 100; // width in pixels 
Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true); 
ivTmp.setImageBitmap(photoBitMap); 
2

ho avuto il problema simile durante la visualizzazione di immagini ad alta risoluzione. Ho cercato e applicato tutte le soluzioni di bitmap Android fornite in http://developer.android.com/training/displaying-bitmaps/index.html e il seguente mekanism cache nel link. ma nessuno di loro funziona. nessuna soluzione giusta da nessuna parte. Poi ho capito che il problema è: non potevo usare la struttura della cartella disegnabile a destra. Stavo mantenendo le immagini ad alta risoluzione nelle cartelle mdpi e hdpi. questo fa sì che Android riduca le immagini alle dimensioni ultra. L'immagine da 100 kb ha causato un aumento della memoria di 20 mb grazie alla sezione di monitoraggio/memoria di Android. così ho aggiunto queste immagini a risoluzione ultra alta alla cartella xxhdpi, poi è stato FISSATO all'improvviso.quindi il mio cursore dell'immagine funziona perfettamente

Problemi correlati