2010-10-22 11 views
5

Aquí está la configuración:Android: unparceling causa una excepción de falta de memoria. Cómo inspeccionar objetos?

  • tengo una actividad con una lista de elementos (actualizado desde el servidor, representada por una clase java normal). Los elementos se procesan a través de 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, luego 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 método "pubExtra (String, Parcelable)", que quería usar para colocar el objeto allí y luego pasarlo a través del intento. Cuando hice esto, el dispositivo comenzó a obtener una fuerza cerca debido a una OutOfMemoryException. Parece que al tratar de eliminar el objeto, solicita ~ 30mb (!)

Parece que el objeto debe contener referencias a otra cosa, ya que el objeto en sí mismo contiene solo algunos campos int/float/String y métodos relacionados . No he podido rastrear esto mirando el código o el inspector de depuración y no sé cómo usar el visor de Heap de manera efectiva.

¿Alguna sugerencia?

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

Respuesta

13

que tenía el mismo problema que se reducía a esto: deslizado hacia arriba y una de mis variables de WASN No está escrito en la secuencia correcta. Creo que Parcelable funciona en un nivel muy bajo.

Supongo que en el nivel bajo, intentó leer una lista de arrays en la ubicación incorrecta de la memoria, y nunca obtuvo el " Deja de leer! "Si Gnal. Entonces, siguió leyendo como loco hasta que Heap Space tocó el límite de la aplicación. * También estoy adivinando que probablemente tenía/están teniendo un problema similar

En pocas palabras: vuelva a comprobar sus funciones de lectura y escritura parcelable y asegurarse de que son la lectura/escritura de las variables en la misma secuencia

  • Aunque esto se solicitó hace bastante tiempo. Encontré esta página a través de Google, así que seguí adelante y la publiqué en caso de que alguien más tuviera el mismo problema.

Editar: Recomendaría la sugerencia de elevine también y aliento invitarla a votar. Esto en realidad me ayudó a reducirlo a ArrayLists en el objeto Parcel

+1

Tuve el mismo problema. Lo que hice fue tratar de leer los valores en orden inverso (pila). Pero en realidad necesitas leerlos en el mismo orden en que los pones. –

+0

Creo que actúa más como un archivo binario, por lo que es más o menos FIFO –

+0

Genial ... me ayudó ... ¡Demonios! –

5

debería intentar usar el Eclipse Memory Analyzer Tool. Instálelo como un complemento en Eclipse, y luego use el botón "Dump Hprof file" en DDMS (se ve como un cilindro verde con una flecha hacia abajo en la pestaña Dispositivos "). Con MAT instalado, Eclipse debería simplemente iniciarlo con algunas vistas para .. inspeccionar su memoria

en caso de publicar algunos de su código, alguien podría ser capaz de encontrar el problema también

Cuestiones relacionadas