Android: unparceling cause di un'eccezione di memoria. Come per ispezionare gli oggetti?

StackOverflow https://stackoverflow.com/questions/3998828

  •  10-10-2019
  •  | 
  •  

Domanda

Ecco la configurazione:

  • Ho un'attività con un elenco di elementi (aggiornato dal server, rappresentato da una classe Java semplice). Gli elementi sono resi attraverso un costume BaseAdapter e visualizzazione personalizzata per ogni riga.
  • Gli oggetti implementano Parcelable, in modo che quando lo schermo è ruotato, le voci vengono salvate nel bundle come ParcelableArrayList, poi restaurato senza andare indietro al server.

Finora, questa è una messa a punto abbastanza semplice, ma voglio passare uno di questi elementi a un'altra attività. Fascio ha un metodo "pubExtra (String, Parcelable)", che ho voluto usare per mettere l'oggetto lì, quindi passare attraverso l'intento. Quando ho fatto questo, il dispositivo iniziato a ricevere una forza vicino a causa di un OutOfMemoryException. Sembra quando si cerca di unparcel l'oggetto, richiede ~ 30MB (!)

Sembra che l'oggetto deve essere in possesso di riferimenti a qualcosa di diverso, dal momento che l'oggetto stesso contiene solo poche / galleggiante campi int / string e dei relativi metodi. Non sono stato in grado di seguire questo giù, cercando in codice o di debug ispettore e non so come utilizzare lo spettatore Heap efficace.

Qualche suggerimento?

Ecco lo stacktrace

/dalvikvm-heap( 5876): Out of memory on a 29098436-byte allocation.
I/dalvikvm( 5876): "main" prio=5 tid=1 RUNNABLE
I/dalvikvm( 5876):   | group="main" sCount=0 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8
I/dalvikvm( 5876):   | sysTid=5876 nice=0 sched=0/0 cgrp=default handle=-1345017816
I/dalvikvm( 5876):   | schedstat=( 1107116708 1124999998 2626 )
I/dalvikvm( 5876):   at java.util.ArrayList.<init>(ArrayList.java:~84)
I/dalvikvm( 5876):   at android.os.Parcel.readArrayList(Parcel.java:1460)
I/dalvikvm( 5876):   at android.os.Parcel.readValue(Parcel.java:1792)
I/dalvikvm( 5876):   at android.os.Parcel.readMapInternal(Parcel.java:2007)
I/dalvikvm( 5876):   at android.os.Bundle.unparcel(Bundle.java:208)
I/dalvikvm( 5876):   at android.os.Bundle.containsKey(Bundle.java:249)
I/dalvikvm( 5876):   at <mypackage>.BaseDetailsActivity.isInModifyState(BaseDetailsActivity.java:184)
I/dalvikvm( 5876):   at <mypackage>.DetailsActivity.onCreate(DetailsActivity.java:230)
I/dalvikvm( 5876):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
I/dalvikvm( 5876):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
I/dalvikvm( 5876):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
I/dalvikvm( 5876):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
I/dalvikvm( 5876):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
I/dalvikvm( 5876):   at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm( 5876):   at android.os.Looper.loop(Looper.java:123)
I/dalvikvm( 5876):   at android.app.ActivityThread.main(ActivityThread.java:4627)
I/dalvikvm( 5876):   at java.lang.reflect.Method.invokeNative(Native Method)
I/dalvikvm( 5876):   at java.lang.reflect.Method.invoke(Method.java:521)
I/dalvikvm( 5876):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
I/dalvikvm( 5876):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
I/dalvikvm( 5876):   at dalvik.system.NativeStart.main(Native Method)
È stato utile?

Soluzione

Ho avuto lo stesso problema che si riduceva a questo: sono scivolato e uno dei miei variabili non è stato scritto nella sequenza corretta. Penso opere Parcelable su un livello molto basso.

La mia ipotesi è che a livello basso, si è cercato di leggere un arraylist alla locazione di memoria sbagliato, e non ha mai avuto la "lettura Stop!" segnale. Quindi, ha mantenuto la lettura come un matto fino alla Heap Spazio colpito il limite di applicazione. * Sono anche indovinando che probabilmente si doveva / stanno avendo un problema simile

In conclusione: doppio controllo la vostra lettura Parcelable e le funzioni di scrittura e assicurarsi che siano leggere / scrivere le variabili nella stessa sequenza

  • Anche se questo è stato chiesto un bel molto tempo fa. Ho trovato questa pagina tramite Google così è andato avanti e ha scritto questo nel caso in cui nessun altro là fuori ha ottenuto lo stesso problema.

Edit: mi sento di raccomandare di elevine suggestione come bene e incoraggio il voto in su. Questo in realtà mi ha aiutato a restringere il campo al ArrayLists nell'oggetto Parcel

Altri suggerimenti

Si dovrebbe provare a utilizzare il Eclipse Memory Analyzer Tool . Installarlo come plugin per Eclipse, e quindi utilizzare il pulsante "Dump di file hprof" in DDMS (si presenta come un cilindro di verde con una freccia verso il basso nella scheda Dispositivi "). Installato con tappetino, Eclipse dovrebbe solo lanciarlo con alcuni punti di vista a ispezionare la vostra memoria.

Se pubblichi po 'del vostro codice, qualcuno potrebbe essere in grado di trovare il problema troppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top