Autore Topic: Out of Memory inspiegabile  (Letto 1335 volte)

Offline GiL1688

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Android 4.4
Out of Memory inspiegabile
« il: 04 Maggio 2015, 18:41:21 CEST »
0
Ciao a tutti,
la mia app mostra un activity di Main, la quale porta a due strade: News e Info.
Info è un'activity con del testo.
News possiede 10 miniature (partono da una jpg 128x128 e le ridimensiona ulteriormente) con altrettanti link: cliccando su uno di questi si accede all'activity PostView.
PostView è una WebView.

Main, News, Info possiedono un'immagine di background già inserita nel XML.
PostView possiede un'immagine di background settata con il .setBackgroundDrawable(Drawable e).

Bene, il problema è che navigando tra queste activity, si giunge con estrema facilità al fatidico LogCat Message:

Codice: [Seleziona]
05-04 16:09:02.340: D/dalvikvm(531): GC_FOR_ALLOC freed 2884K, 11% free 29419K/32711K, paused 138ms
05-04 16:09:10.510: I/dalvikvm-heap(531): Clamp target GC heap from 32.182MB to 32.000MB
05-04 16:09:10.510: D/dalvikvm(531): GC_CONCURRENT freed 497K, 6% free 30851K/32711K, paused 4ms+14ms
05-04 16:09:20.111: I/dalvikvm-heap(531): Clamp target GC heap from 32.293MB to 32.000MB
05-04 16:09:20.131: D/dalvikvm(531): GC_FOR_ALLOC freed 594K, 6% free 30966K/32711K, paused 62ms
05-04 16:09:20.131: I/dalvikvm-heap(531): Forcing collection of SoftReferences for 1324816-byte allocation
05-04 16:09:20.261: I/dalvikvm-heap(531): Clamp target GC heap from 32.265MB to 32.000MB
05-04 16:09:20.261: D/dalvikvm(531): GC_BEFORE_OOM freed 30K, 6% free 30935K/32711K, paused 133ms
05-04 16:09:20.261: E/dalvikvm-heap(531): Out of memory on a 1324816-byte allocation.
05-04 16:09:20.271: I/dalvikvm(531): "main" prio=5 tid=1 RUNNABLE
05-04 16:09:20.271: I/dalvikvm(531):   | group="main" sCount=0 dsCount=0 obj=0x40997460 self=0x12810
05-04 16:09:20.271: I/dalvikvm(531):   | sysTid=531 nice=0 sched=0/0 cgrp=default handle=1074082952
05-04 16:09:20.281: I/dalvikvm(531):   | schedstat=( 10623160111 9013058459 3198 ) utm=941 stm=121 core=0
05-04 16:09:20.281: I/dalvikvm(531):   at android.graphics.Bitmap.nativeCreate(Native Method)
05-04 16:09:20.281: I/dalvikvm(531):   at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
05-04 16:09:20.281: I/dalvikvm(531):   at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
05-04 16:09:20.291: I/dalvikvm(531):   at android.view.View.buildDrawingCache(View.java:10528)
05-04 16:09:20.291: I/dalvikvm(531):   at android.view.ViewGroup.drawChild(ViewGroup.java:2754)
05-04 16:09:20.291: I/dalvikvm(531):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
05-04 16:09:20.291: I/dalvikvm(531):   at android.view.View.draw(View.java:10883)
05-04 16:09:20.291: I/dalvikvm(531):   at android.view.ViewGroup.drawChild(ViewGroup.java:2899)
05-04 16:09:20.302: I/dalvikvm(531):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
05-04 16:09:20.302: I/dalvikvm(531):   at android.view.View.draw(View.java:10883)
05-04 16:09:20.302: I/dalvikvm(531):   at android.widget.FrameLayout.draw(FrameLayout.java:450)
05-04 16:09:20.322: I/dalvikvm(531):   at android.view.ViewGroup.drawChild(ViewGroup.java:2899)
05-04 16:09:20.322: I/dalvikvm(531):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
05-04 16:09:20.322: I/dalvikvm(531):   at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
05-04 16:09:20.322: I/dalvikvm(531):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
05-04 16:09:20.322: I/dalvikvm(531):   at android.view.View.draw(View.java:10883)
05-04 16:09:20.351: I/dalvikvm(531):   at android.widget.FrameLayout.draw(FrameLayout.java:450)
05-04 16:09:20.351: I/dalvikvm(531):   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2106)
05-04 16:09:20.361: I/dalvikvm(531):   at android.view.ViewRootImpl.draw(ViewRootImpl.java:2005)
05-04 16:09:20.361: I/dalvikvm(531):   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1613)
05-04 16:09:20.361: I/dalvikvm(531):   at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
05-04 16:09:20.361: I/dalvikvm(531):   at android.os.Handler.dispatchMessage(Handler.java:99)
05-04 16:09:20.381: I/dalvikvm(531):   at android.os.Looper.loop(Looper.java:137)
05-04 16:09:20.381: I/dalvikvm(531):   at android.app.ActivityThread.main(ActivityThread.java:4340)
05-04 16:09:20.381: I/dalvikvm(531):   at java.lang.reflect.Method.invokeNative(Native Method)
05-04 16:09:20.392: I/dalvikvm(531):   at java.lang.reflect.Method.invoke(Method.java:511)
05-04 16:09:20.392: I/dalvikvm(531):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-04 16:09:20.392: I/dalvikvm(531):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-04 16:09:20.392: I/dalvikvm(531):   at dalvik.system.NativeStart.main(Native Method)

Ho provato a seguire molto scrupolosamente i consigli forniti alla pagina Displaying Bitmaps Efficiently | Android Developers, ma niente, l'OutOfMemory è sempre lì.

Onestamente la mia app è veramente banale, non posso credere che 4 activity in croce con un background image possano mandare a quel paese l'heap, mi rifiuto..
Dov'è che sbaglio? Ho provato a ridimensionare le immagini, ma non ho risolto nulla.

Se vi occorre del codice per poter rispondere sono a disposizione,
grazie

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Out of Memory inspiegabile
« Risposta #1 il: 04 Maggio 2015, 20:26:41 CEST »
0
Puoi incappare in OoM anche se credi e distruggi parecchi megabyte di oggetti, perchè la creazione è istantanea, mentre la distruzione è differita (anche di molto).

Faccio un esempio: carichi una activity che ha uno sfondo da 1MB, torni indietro, poi la ricarichi, e via così varie volte molto velocemente; ecco, può accadere che la memoria dell'heap (in pratica la memoria delle app scritte in java) si saturi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Out of Memory inspiegabile
« Risposta #2 il: 05 Maggio 2015, 09:24:27 CEST »
0
Il background inserito nell'xml in quale cartella l'hai inserito?
I numeri contano molto di più del seme.

Offline GiL1688

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Android 4.4
Re:Out of Memory inspiegabile
« Risposta #3 il: 05 Maggio 2015, 11:57:13 CEST »
0
Grazie bradipao per la tua risposta, effettivamente mi ero accorto che temporeggiando qualche istante avrei rallentato di molto il giungimento all'OoM, ma questo purtroppo non mi garantisce che non ci si giungerà mai. Non vorrei limitare i miei futuri utenti ad utilizzare l'app senza la frenesia che di solito li contraddistingue ;)

eagledeveloper (bellissimo nick, te lo dice un laziale), per il background sono partito da una strada che ho provato a raffinare per tentare di risolvere il problema, ma senza successo.

Il mio Workspace è alberato così:
- Progetto Main (Android Application Project)
- Progetto Library (Android Application Project)

Nel main ci sono classi Java e Activity di FrontEnd, nel library c'è tutto il BackEnd, tra cui, appunto, i background.

La jpg di background si trova in:
- Progetto Library --> res --> drawable-hdpi
- Progetto Library --> res --> drawable-ldpi
- Progetto Library --> res --> drawable-mdpi
- Progetto Library --> res --> drawable-xhdpi
- Progetto Library --> res --> drawable-xxhdpi

Per velocizzare la cosa ho seguito una prassi molto poco performante, ovvero ho inserito la stessa identica jpg in ognuna di queste cartelle.
La jpg pesa circa 600Kb e ha dimensioni 1080x1920.

In passato ho provato a ridimensionare la stessa jpg nei modi di seguito:
- drawable-ldpi = 320x570 (100Kb)
- drawable-mdpi = 320x570 (100Kb)
- drawable-hdpi = 480x460 (250Kb)
- drawable-xhdpi = 1080x1920 (600Kb)
- drawable-xxhdpi = 1080x1920 (600Kb)

Inutile dire che anche così non ho risolto nulla, e nemmeno lo ho rallentato a dirla tutta... La Memoria si satura già alla terza Activity.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Out of Memory inspiegabile
« Risposta #4 il: 05 Maggio 2015, 12:24:09 CEST »
0
Se il problema è la continua allocazione/deallocazione io proverei questa cosa:
- estendi l'oggetto Application (che equivale a crearsi un Singleton) e crea al suo interno una Bitmap dove caricherai sfondo una volta per tutte alla creazione dell'app.
- quando vai ad impostare lo sfondo delle activity, usa la bitmap istanziata nell'oggetto Application, non il riferimento al drawable.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GiL1688

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Android 4.4
Re:Out of Memory inspiegabile
« Risposta #5 il: 05 Maggio 2015, 13:06:00 CEST »
0
Ottimo consiglio, ma ti chiedo: che fare se l'Activity Main ha il background1, l'Activity News ha il background2 e l'Activity About ha il background3?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Out of Memory inspiegabile
« Risposta #6 il: 05 Maggio 2015, 13:36:32 CEST »
0
Ottimo consiglio, ma ti chiedo: che fare se l'Activity Main ha il background1, l'Activity News ha il background2 e l'Activity About ha il background3?

Ammetto di non essere certo al 100%, ma se riutilizzi lo stesso oggetto Bitmap caricandoci sopra i vari background (quindi senza ricrearne uno ogni volta), probabilmente riutilizzi anche la stessa "memoria" senza allocarne di nuova.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GiL1688

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Android 4.4
Re:Out of Memory inspiegabile
« Risposta #7 il: 05 Maggio 2015, 13:42:14 CEST »
0
D'accordo, oggi pomeriggio proverò ad implementare questa soluzione allora, e per essere sicuro di non scrivere codice a casaccio mi affiderò a questa soluzione: Extending the Android Application class and dealing with Singleton | devahead BLOG .

Rimango in ogni caso in ascolto di altre proposte risolutive, o in alternativa di qualche lume sulla natura del problema, la quale mi lascia - lo ripeto - senza parole.
Se un'app con 3 background si pianta andando avanti e indietro due volte, come fanno app come Asphalt, Infinity Blade, Clash of Clans a reggere la quantità mastodontica di dati che gestiscono?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Out of Memory inspiegabile
« Risposta #8 il: 06 Maggio 2015, 01:19:51 CEST »
0
Quei programmi non sono scritti in Java o meglio solo una minima parte, il core del programma è scritto di solito in C/C++ utilizzando NDK. I programmi nativi hanno come limite di memoria la massima disponibile.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Out of Memory inspiegabile
« Risposta #9 il: 06 Maggio 2015, 07:55:19 CEST »
0
Come dice iceweasel, le app scritte in C/C++ hanno a disposizione tutta la memoria, mentre quelle in Java possono allocare solo fino a riempire l'heap size prevista per quel telefono, che può essere molto inferiore (vedi sotto).

Phones (Android Version):

    HTC Wildfire (2.2.1) = 16MB
    HTC Wildfire S (2.3.5) = 20MB
    HTC Salsa (2.3.3) = 20MB
    HTC Desire (2.3.3) = 32MB
    HTC Desire S (2.3.5) = 32MB
    Sprd - Richview - S111 (2.3.5) = 32MB
    Samsung Galaxy S GT-I9000 (2.2) = 48MB
    Samsung Galaxy R GT-I9103 (2.3.5) = 64MB
    Samsung Galaxy Y GT-S5360 (2.3.5) = 64MB
    Samsung Galaxy Note N7000 (4.1.2) = heapstartsize=8m, heapgrowthlimit=64m, heapsize=256m
    Samsung Galaxy S3 GT-I9300 (4.3, xhpdi) = 8/64/256MB
    Samsung Galaxy S4 GT-I9505 (4.4, xxhpdi) = 8/128/512MB
    Google Galaxy Nexus (4.3) = 8/96/256MB
    Google Nexus 4 (4.4, xhdpi) = 8/192/512MB
    Google Nexus 5 (4.4, xxhdpi) = 8/192/512MB

Tablets (Android Version):

    Samsung Galaxy Tab GT-P1000 (2.2) = 48MB
    Sasmung Galaxy Tab 8.9 GT-P7300 (3.2) = 5/64/288MB
    Sasmung Galaxy Tab 10.1 GT-P7500 (3.2) = 5/64/288MB
    Sasmung Galaxy Tab 3 10.1 GT-P5200 (4.2, mdpi) = 8/96/256MB
    Acer Iconia A500 (3.2.1) = 5/48/256MB
    Kindle Fire HD 7" (4.0.3) = 5/48/256MB
    Asus Transformer Prime TF201 (4.1.1) = 5/48/256MB
    Nexus 10 (4.4.3) 16/192/512 MB
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

iClaude

  • Visitatore
Re:Out of Memory inspiegabile
« Risposta #10 il: 06 Maggio 2015, 10:54:44 CEST »
0
Rimango in ogni caso in ascolto di altre proposte risolutive, o in alternativa di qualche lume sulla natura del problema, la quale mi lascia - lo ripeto - senza parole.
Se un'app con 3 background si pianta andando avanti e indietro due volte, come fanno app come Asphalt, Infinity Blade, Clash of Clans a reggere la quantità mastodontica di dati che gestiscono?

Prova anche questo metodo:
- inserisci gli sfondi in un'unica cartella nodpi
- carica l'immagine con l'effettiva  dimensione voluta, come spiegato nelle guide ufficiali

Offline GiL1688

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Android 4.4
Re:Out of Memory inspiegabile
« Risposta #11 il: 06 Maggio 2015, 17:12:51 CEST »
0
Grazie,
appena trovo del tempo tenterò anche questa soluzione! Vi faccio sapere :-)

Offline dalamar1977

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motoroloa Moto G2
  • Sistema operativo:
    OSX WIN LINUX
Re:Out of Memory inspiegabile
« Risposta #12 il: 07 Maggio 2015, 11:47:50 CEST »
0
Risposta magari stupida, ma chiudi le activity tra un passaggio e l'altro o le lasci in BG?

Nik

Offline GiL1688

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Android 4.4
Re:Out of Memory inspiegabile
« Risposta #13 il: 11 Maggio 2015, 16:42:09 CEST »
0
Mi stai mettendo un bel dubbio adesso..

Per passare dall'activity A alla B attraverso un ImageButton ho messo nell'XML della A il seguente codice:

Codice: [Seleziona]
<ImageButton
                CUT
                android:onClick="openB"
                CUT />

E nella classe Java dell'activity A ho così implementato il passaggio:

Codice: [Seleziona]
public void openB(View view) {
           
            Intent exB= new Intent(this, ActB.class);
        startActivity(exB);
       
    }

A questo punto quando l'esecuzione passa all'activity B, la A non viene automaticamente distrutta? Provando a mettere un this.finish() subito dopo lo startActivity l'esecuzione mi scoppia in una NullPointerException :S

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Out of Memory inspiegabile
« Risposta #14 il: 12 Maggio 2015, 13:04:44 CEST »
0
L'Activity A non viene distrutta resta in background che è giusto così quando fai back dall'Activity B torni alla A senza ricrearne una nuova. Ma se dalla B fai ancora startActivity di A ne parte una nuova se non fai attenzione ai flag.
I numeri contano molto di più del seme.