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 (!)
- Transmisión de JSONObject a otra actividad
- Códigos de tipo de desbloqueo y valor de compensación y su significado?
- ¿La aplicación de Android restablece el cambio de orientación, la mejor manera de manejar?
- ¿Existe una manera conveniente de crear clases de datos Parcelable en Android con Kotlin?
- Pasar lista de objetos complejos de actividad a fragmento
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)
- ¿Cómo puedo recuperar de un paquete una secuencia de caracteres que se guardó utilizando TextUtils.writeToParcel (...)?
- ¿Cómo leer / escribir un booleano al implementar la interfaz Parcelable?
- Android.os.TransactionTooLargeException tirado al azar
- Cómo implementar correctamente Parcelable con un ArrayList <Parcelable>?
- La transferencia de ByteArray a través de Parcel devuelve NullPointerException
- Agregando parcelable a una clase de interfaz para objetos personalizados
- Arraylist en objeto parcelable
- ¿Es posible distribuir una clase genérica?
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.
- ¿Cómo puedo copia de seguridad de archivos sqlite en tarjeta SD mediante programación?
- Cómo depurar el código nativo de Android en un dispositivo real