Android: causas unparceling fuera de la excepción de memoria. ¿Cómo inspeccionar objetos?

Aquí está la configuración:

  • Tengo una actividad con una lista de elementos (actualizada desde el servidor, representada por una clase java simple). Los elementos se procesan mediante un BaseAdapter personalizado y una vista personalizada para cada fila.
  • Los elementos implementan Parcelable, de modo que cuando se gira la pantalla, los elementos se guardan en el paquete como ParcelableArrayList y se restauran sin volver al servidor.

Hasta ahora, esta es una configuración bastante sencilla, sin embargo quiero pasar uno de estos elementos a otra actividad. Bundle tiene un "pubExtra (String, Parcelable)" método, que quería utilizar para poner el objeto allí, a continuación, pasar a través de la intención. Cuando hice esto, el dispositivo comenzó a conseguir una fuerza cerca debido a una excepción OutOfMemoryException. Parece al intentar unparcel el objeto, pide ~ 30mb (!)

Parece que el objeto debe tener referencias a otra cosa, ya que el objeto en sí sólo contiene unos pocos campos int / float / String y métodos relacionados. No he podido seguir esto abajo mirando el inspector del código o de la depuración y no sé utilizar el espectador del montón con eficacia.

¿Alguna sugerencia?

Aquí está el 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) 

Tuve el mismo problema que se redujo a esto: me resbalé y una de mis variables no fue escrita en la secuencia correcta. Creo que Parcelable funciona a un nivel muy bajo.

Mi conjetura es que en el nivel bajo, trató de leer un arraylist en la ubicación de memoria equivocada, y nunca obtuvo la "Stop reading!" señal. Por lo tanto, siguió leyendo como loco hasta que el espacio Heap golpeó el límite de la aplicación. * También estoy adivinando que probablemente tenía / están teniendo un problema similar

En pocas palabras: revise sus funciones de lectura y escritura parcelables y asegúrese de que están leyendo / escribiendo las variables en la misma secuencia

  • Aunque esto fue pedido hace bastante tiempo. Encontré esta página a través de Google así que fui adelante y fijé esto en caso cualquier persona hacia fuera allí consiguió el mismo problema.

Editar: Yo recomendaría la sugerencia de elevine también y me animo a votar. Esto realmente me ayudó a reducirlo a ArrayLists en el objeto Parcel

Debe intentar utilizar la herramienta Eclipse Memory Analyzer . Instálelo como un complemento a Eclipse y luego use el botón "Dump Hprof file" en DDMS (parece un cilindro verde con una flecha hacia abajo en la pestaña Dispositivos). Con MAT instalado, Eclipse debería lanzarlo con algunas vistas para Inspeccionar su memoria.

Si publica parte de su código, es posible que alguien pueda encontrar el problema también.

  • Hacer una clase parcelable que contiene la lista de objetos personalizados
  • Envío de la lista de objetos del array entre actividades con Parcelable
  • Poner un objeto en el mensaje de Handler
  • Utilice Parcelable para pasar un objeto de una actividad de android a otra
  • Android Parcelable y objeto que pasa por referencia
  • ¿Cómo almacenar permanentemente objeto personalizado parcelable?
  • Beneficio de usar Parcelable en lugar de serializar objetos
  • Falta el campo CREATOR Parcelable?
  • ¿Está utilizando Serializable en Android mal?
  • Hacer ArrayList de objetos personalizados parcelable
  • ¿Qué cargador de clases usar con Parcel.readHashMap?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.