2012-05-06 9 views
5

Aquí hay algunas observaciones de gestión de memoria nuevas a las que me gustaría escuchar una opinión con experiencia.¿Mapas de bits de Android en la memoria de fuga xml?

Parece que la configuración de android: backgound = "@ drawable/xyz" en un diseño xml causa pérdida de memoria en mi aplicación. Las actividades respectivas mantienen apilando hasta que obtengo un error OOM. Esto es especialmente cierto si giro la orientación del dispositivo.

Sin embargo, si cargo el mismo recurso con setBackgoundResource(), y luego borro la devolución de llamada y establezco la referencia de fondo en nulo, no hay ninguna fuga en absoluto.

que es, por primera vez en onCreate()

mMainLayout.setBackgroundResource(R.drawable.background_general_android); 

y luego en OnDestroy()

mMainLayout.getBackground().setCallback(null); 
mMainLayout.setBackgroundDrawable(null); 

¿Es esta más o menos correcta, o me estoy perdiendo algo esencial?

+0

Me enfrento con el mismo problema de vez en cuando. Trataré de administrar el mapa de bits en onCrate y onDestroy. ty – guness

Respuesta

1

Esto solo ocurrirá si mantiene una copia de los objetos extraíbles en un caché estático, por ejemplo. También es posible que esté filtrando sus actividades y estableciendo los derivables en nulo, simplemente oculta el problema por un poco más de tiempo. Deberías usar una herramienta como MAT para inspeccionar el contenido de tu montón y descubrir qué está pasando.

+1

La observación anterior se basa en un largo y doloroso fin de semana con MAT :) Esencialmente hice un diseño lineal barebone con nada más que 500 k de recursos de fondo, y una actividad que no hizo más que cargar el xml con setContentView(). Cuando el mapa de bits se estableció dentro de xml => pérdida de memoria y OOM. Cuando se carga programáticamente y se borra en onDestroy(), no hay problemas. Sin embargo, debo mencionar que el resto de la aplicación, fuera de esta actividad mínima de prueba, es bastante grande, lo que puede afectar los resultados. Específicamente, quería probarlo en "aplicación real interior". La versión de Android es 2.2 (nivel 8). – perza

Cuestiones relacionadas