2012-09-15 1156 views
7

Trabajo con varios objetos grandes y no sé cómo administrar las pérdidas de memoria. Rastreé el tamaño del montón de mi aplicación y no para de crecer (como la memoria asignada).Android Drawables pérdida de memoria

Es especialmente el tipo "byte array (byte [])" que crece y nunca disminuye. (en la vista del montón de DDMS en Eclipse)

Mi aplicación se compone de una actividad que utiliza fragmentos. Esos fragmentos muestran varias imágenes grandes. Traté de establecer la devolución de llamada arrastrables a nulo, establecí los drawables en nulos, borré mi caché volátil (que evita que mi aplicación haga demasiados IO de disco) cuando recupero un fragmento pero el montón nunca disminuye.

De hecho, cada vez que llamo: Drawable.createFromResourceStream (context.getResources(), value, new FileInputStream (f), f.getName(), opts); el montón crece. ¿Cómo puedo liberar memoria?

Gracias!

Respuesta

6

Una pérdida de memoria ocurre cuando Java encuentra objetos en la memoria a los que hace referencia el código, lo que impide que Garbage Collector libere esta memoria. Una causa común en Android es hacer referencia al contexto de la actividad en lugar del contexto de la aplicación. Asegúrese de que su contexto hace referencia a la aplicación (es decir, usar getApplicationContext en lugar de utilizar this. Marque esta video para la explicación de las pérdidas de memoria y también comprobar esta question.

+0

que hacen referencia al contexto de aplicación y no el contexto de actividad, cree que el problema es que mis fragmentos no se destruyen y se fuga? – abecker

+0

Quizás, consulte el video en mi respuesta sobre cómo usar la herramienta de análisis de memoria SDK (MAT) para encontrar los objetos que se están filtrando –

+1

¡Hola! ¡Resolví mi problema! De hecho, mis fragmentos se mantuvieron en la memoria y fue mi caché volátil estática lo que lo mantuvo. Realmente no sé por qué tiene este comportamiento. Instalé un DrawableManager, cuando creo un fragmento, que tiene varios métodos para recuperar Drawables del disco o de la red. Cuando entrega uno a mis puntos de vista, lo mantenía en un HashMap estático (para reutilizar este caché en los otros fragmentos). Solo hago que mi HashMap no sea estático (no puedo reutilizar el caché volátil entre los fragmentos). No sé por qué mi fragmento se mantuvo en la memoria. – abecker

2

La pregunta parece respondió sino un mensaje por Romain tipo parece relevante para obtener más información :. Avoiding Memory Leaks

al parecer, si (por ejemplo) define un dibujable una imagen de fondo a una vista de texto mediante el uso de setBackgroundDrawable * (adjuntando tanto el dibujable a la vista) como a continuación, cambiar la orientación (la destrucción de la actividad y volver a dibujar el UI) el dibujable aún tendrá acceso a la actividad anterior (después de la destrucción de la actividad anterior), creando así una pérdida de memoria.

* (como nota al margen - setBackgroundDrawable ha sido deprecated since API level 16)

+0

... y aún setBackgroundDrawable todavía es llamado internamente por setBackground incluso en API 24. :) –