Lecturas eh información recomendada para trabajar problemas de memoria?

1,301 views
Skip to first unread message

Gabriel Pozo

unread,
Aug 20, 2013, 10:57:47 AM8/20/13
to desarrollad...@googlegroups.com
Hola como están?

Estoy trabajando con una aplicación Android en la que realizo cosas con muchas  imágenes, y mi problema es que termino teniendo problemas de memoria :P (maldito GC :D ) eh estado mirando cosas como:



Quería saber si alguno a tenido este tipo de problemas, y a visto algún material útil por ahí, o tiene alguna recomendación desde la experiencia, para tratar este tipo de problemas.

P.D: Estoy trabajando para la carga de imágenes con un enfoque similar al del ejemplo oficial, cargando las imágenes con AsyncTask y teniendo una cache. Pero al moverme mucho por la app, saltando de una activity a otra, termino teniendo los problemas de memoria :P :(
 
Saludos, Gabriel

http://aprendiendodeandroidymas.com/

yeho

unread,
Aug 20, 2013, 12:42:58 PM8/20/13
to desarrollad...@googlegroups.com


Hola Gabriel
a mi me paso en la app que estoy haciendo actualmente
y se soluciono de la siguiente manera:
       
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        Bitmap bmp = BitmapFactory.decodeFile(path, options);


la segunda linea de codigo es la que hace que no se cargue a memoria la imagen y por lo tanto elimina problemas del tipo que mencionas

espero te funcione

Saludos!!

Gabriel Pozo

unread,
Aug 20, 2013, 1:13:49 PM8/20/13
to desarrollad...@googlegroups.com
Gracias por el consejo, eso lo estoy usando, pero con una linea de código lamentablemente no se va a solucionar :P Sigo leyendo:


Esto es lo que eh encontrado por ahora, ademas de mis primeros enlaces:

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Para ver este debate en la Web, visita https://groups.google.com/d/msgid/desarrolladores-android/bc7b1f4c-a7f8-4c0c-8e5c-bcbd07d49580%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--

yeho

unread,
Aug 20, 2013, 1:25:09 PM8/20/13
to desarrollad...@googlegroups.com
a mi me daba problemas con una tablet samsung, y en otras tablets no se presentaba el OutOfMemory
en realidad aparte de meter esa linea de codigo, tambien lo combine con un buen manejo del GarbageCollector,

Saludos!!

Juan de Dios Maldonado Sánchez

unread,
Aug 20, 2013, 1:57:57 PM8/20/13
to desarrollad...@googlegroups.com
Yo de ti haría un análisis de memoria de tu aplicación usando el Dalvik Debug Monitor para saber el origen de tu problema:



2013/8/20 yeho <jsh...@gmail.com>
a mi me daba problemas con una tablet samsung, y en otras tablets no se presentaba el OutOfMemory
en realidad aparte de meter esa linea de codigo, tambien lo combine con un buen manejo del GarbageCollector,

Saludos!!

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Gabriel Pozo

unread,
Aug 20, 2013, 2:50:53 PM8/20/13
to desarrollad...@googlegroups.com
Gracias Juan, como puse en el anterior mail, justo esta mirando ese post :D
Me hice un dump del heap y ahora lo estoy analizando con esto:


Vamos a ver que sale, ya que hacia bastante que no me ponía a ver este tipo de cosas :P




Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Cristian Monforte

unread,
Aug 21, 2013, 10:46:55 AM8/21/13
to desarrollad...@googlegroups.com
Buenas Gabriel,

Yo he sufrido bastante los problema de memoria trabajando con imagenes. A la que intentes abrir una imagen grande te va a dar muchos problemas con la carga en un bitmap.

Algunos consejos:

-primero accede a la imagen y mira el tamaño de esta imagen -> con el flag que te comentan más arriba lo puedes hacer "options.inJustDecodeBounds = true;" Nunca la abras sin validar que tamaño tiene, no tiene sentido abrir una foto gigante en una pantalla de 480x320.

-si solo es para mostrar, yo lo que hago es abrir una copia de esta imagen en más baja calidad o tamaño menor. Pongo un tamaño máximo (1024px) y miro como es la imagen que quiero mostrar, si es más grande que mi máximo la abro en más pequeño. El ejemplo de arriba tambien te lo muestra, en la variable "options.inSampleSize" indicas con que factor abres la imagen, miratelo. Solo puntualizar que a la imagen le haces el resize en multiplos de 2, por tanto 2-4-8...

-Por otra parte, si haces cosas más complejas con las imagenes, siempre estoy preparado para hacer un catch de una exception de outofmemory en los objetos bitmaps. Y si me da esto, lo que hago es trabajar con imagenes más pequeñas todavia.

-También, lo comento por si acaso, nunca pases entre actividades un objeto bitmap, utiliza la uri de esta.


Espero que te sirva de ayuda.


Gabriel Pozo

unread,
Aug 21, 2013, 10:58:22 AM8/21/13
to desarrollad...@googlegroups.com
Gracias Cristian por responder, claro realizo una verificación de las imágenes, si llegan a ser mayores a cierto tamaño entrego una copia re-dimensionada, y no paso imágenes entre activitys ;)
Si mi problema es con mis amigos  OutOfMemory :P el tema no es el tamaño, si no que trabajo con muchas, básicamente (como escribí hace un tiempo) armo mi propio mapa con imágenes.

Ahora el tema no es cuando armo el mapa en si, sino, cuando salgo y entro de manera seguida a la activity que contiene el mapa. Por algún motivo sobre cargo la memoria, a pesar de trabajar con Weakreference, AsyncTask para descargar las imágenes, y algunas otras cosas que vi que aconseja la web de developer.android.com para el manejo de imágenes :P Estoy ahora tratando de analizar el problema con la herramienta Memory Analyzer a ver si encuentro donde, como diría un compatriota, se me escapa la tortuga :D :P



--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Cristian Monforte

unread,
Aug 21, 2013, 11:09:48 AM8/21/13
to desarrollad...@googlegroups.com
a que te refieres con un mapa? estilo galeria enseñando imagenes? o estilo hacer scroll e ir enseñando imagenes?

Otra cosa que puedes hacer es mirar en http://www.androidviews.net/ algo que sea similar, muchos de ellos tienen el codigo fuente en github y puedes mirar como gestionan las imagenes...haciendo recycle, cath del outofmemory, con pilas, etc....


2013/8/21 Gabriel Pozo <jack...@gmail.com>

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Cristian Monforte

yeho

unread,
Aug 21, 2013, 11:19:32 AM8/21/13
to desarrollad...@googlegroups.com

si el problema es al entrar y salir varias veces al activity entones yo me decantaria mas por cerrar tu activity con un finish(), setear mis variables ( mapa, objetos, bitmaps, arrays ) a null y llamar al garbage collector


Saludos!!

Gabriel Pozo

unread,
Aug 21, 2013, 11:20:40 AM8/21/13
to desarrollad...@googlegroups.com
Con mapa me refiero a un mapa :D En la empresa donde estoy trabajan con mapas, son similares a los de OpenStreetMap, y para lo que ellos necesitan la app, necesitan usar sus mapas. Así que en la Activity principal, armo el mapa con las imágenes que necesito según la ubicación que obtengo del GPS, tengo un zoom, un centrar mapa, y te podes mover en el, al estilo de Google Maps, pero con una estetica mas parecida a la OpenStreetMap y mientras no salgas de esa Activity no tengo problemas, el tema esta que al salir y entrar de manera repetida, se me desborda el uso de memoria. 

Suposición mía: A pesar de usar Weakreference y realizando el recycle, creo que por algún motivo no se eliminan todas las referencias, por este motivo el GC no libera memoria, y se termina llenando el heap de la DVM :P
Va o algo de eso, creo que termina sucediendo :P





Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Gabriel Pozo

unread,
Aug 21, 2013, 11:21:57 AM8/21/13
to desarrollad...@googlegroups.com
Gracias yeho, ahora eso es lo que estoy intentando realizar, todavía sin obtener los resultados que deseo :P


El 21 de agosto de 2013 12:19, yeho <jsh...@gmail.com> escribió:

si el problema es al entrar y salir varias veces al activity entones yo me decantaria mas por cerrar tu activity con un finish(), setear mis variables ( mapa, objetos, bitmaps, arrays ) a null y llamar al garbage collector


Saludos!!

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Cristian Monforte

unread,
Aug 27, 2013, 7:28:51 AM8/27/13
to desarrollad...@googlegroups.com
que tal Gabriel? has podido solucionar el problema?


2013/8/21 Gabriel Pozo <jack...@gmail.com>

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Cristian Monforte

Gabriel Pozo

unread,
Aug 27, 2013, 8:54:53 AM8/27/13
to desarrollad...@googlegroups.com
Hola Cristian, si gracias por preguntar, lo pude solucionar, no lo coloque acá porque es medio particular lo que estaba haciendo y no creo que sea una solución para la mayoría, pero básicamente lo que tuve que realizar fueron las siguientes cosas:

Esto era lo que ya tenía implementado:

Utilizar WeakRefences
Usar recycling 
Pedir las imágenes al servidor por medio de AyncTask 
Verificar el tamaño de las imágenes, y de ser necesario re-dimensionar. (En la mayoría de los casos esto no es necesario en mi caso, porque las imágenes son nuestra)
Disminuir el tamaño de la cache que uso para guardar las imágenes.
La mayoría de esto les recomiendo ver el ejemplo del sitio oficial: http://developer.android.com/training/displaying-bitmaps/index.html Donde se implementa todo eso.

Y lo que termine agregando

Ademas de eso fue, detener todas las asynctask que peticionan las imágenes cuando se sale de la vista (también en el ejemplo esta, pero no lo usa) ya que no me había dado cuenta de que si el usuario entraba y salia repetidas veces y movía el mapa, se me iban sumando hilos y hasta que estos no terminan seguían corriendo todos a las vez y cada vez era más :P , naturalmente comenzaba a subir el consumo de memoria :P
Al salir de esa vista, cerrar correctamente la cache, des-referenciar de forma explicita todos los elementos de la UI, por ejemplo en un layout utilizar métodos como removeAllView() y luego dejarlo en null. Después de eso llamar de manera explicita al GC, para que limpie la memoria lo más pronto que pueda. En algunos sectores desde donde llamaba a esa Activity utilizar los flags: (Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK) 

Creo que no se me olvida nada :D En resumen, no se si será lo más optimo, es lo que me ha funcionando, si alguno tiene alguna otra recomendación?

P.D: Aunque extrañamente no me había dado cuenta lo de las asynctask :P :D me termino ayudando la herramienta Memory Analyzer, esta buena, aunque al no tener mucha experiencia con la misma, seguramente no le pude sacar todo el jugo :P




Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Cristian Monforte

unread,
Aug 27, 2013, 10:01:50 AM8/27/13
to desarrollad...@googlegroups.com
que bien, perfecta aportación! 

miraré el memory analyzer para ver si me puede ayudar a mí.

Ivan Villa Hernandez

unread,
May 18, 2016, 8:12:10 PM5/18/16
to desarrolladores-android
Hola Yeho
Desarrolle esto con documentación obtenida con android developers, basicamente es el complemento del codigo que muestrar, lo cual funciono muy bien pero ahora tengo el problema de que cuando escala una imagen me cambia la orientación de la misma al mostrarla, saben por qué sucede esto y como puedo solucionarlo? Gracias

yeho

unread,
May 18, 2016, 9:47:11 PM5/18/16
to desarrolladores-android
creo que las normas del grupo invitan a crear nuevos post para preguntas nuevas pero hace tiempo que no entraba a esta lista asi que no recuerdo bien las reglas.... aqui la respuesta a tu pregunta, espero te ayude http://stackoverflow.com/questions/11026615/captured-photo-orientation-is-changing-in-android

Reply all
Reply to author
Forward
0 new messages