Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 09/09/12, 00:27:57
Array

[xs_avatar]
adrianr1 adrianr1 no está en línea
Usuario muy activo
· Votos compra/venta: (29)
 
Fecha de registro: sep 2009
Localización: Madrid
Mensajes: 2,472
Modelo de smartphone: iPhone 14 PRO MAX
Tu operador: Movistar
Me sale en la consola de desarrollador que una app tiene un error

Hola, acabo de ver en la consola de desarrolador que una app tiene un error. Exactamente pone ésto:
OutOfMemoryError
en BitmapFactory.nativeDecodeStream()

La app está hecha con appinventor, y no entiendo de ésto, alguien sabría decirme que es? Gracias!
Responder Con Cita


  #2  
Viejo 09/09/12, 03:08:42
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Ese error es muy común trabajando con Bitmaps, y es facilmente solucionable trabajando con el SDK oficial de Android, marcando los Bitmap como referencias suaves (SoftReference).

Pero con el AppInventor no tengo ni idea de como solucionarlo.
Responder Con Cita
  #3  
Viejo 09/09/12, 11:45:41
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
Si no me equivoco, eso significa que el móvil no puede asignar suficiente RAM para mostrar los bitmaps. Como dice kriogeN, para evitarlo se deben usar SoftReferences o WeakReferences (preferentemente el 1º), y/o reducir el peso de las imágenes para que ocupen menos memoria al cargarlas. El problema es que imagino que pocos de los de aquí hemos usado AppInventor y no sabemos qué tratamiento hay que darles a los bitmaps en el AppInventor, ni si se le puede dar alguno.

Un saludo.
Responder Con Cita
  #4  
Viejo 09/09/12, 13:27:43
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por Arasthel Ver Mensaje
Si no me equivoco, eso significa que el móvil no puede asignar suficiente RAM para mostrar los bitmaps. Como dice kriogeN, para evitarlo se deben usar SoftReferences o WeakReferences (preferentemente el 1º), y/o reducir el peso de las imágenes para que ocupen menos memoria al cargarlas. El problema es que imagino que pocos de los de aquí hemos usado AppInventor y no sabemos qué tratamiento hay que darles a los bitmaps en el AppInventor, ni si se le puede dar alguno.

Un saludo.
El problema es que desde tiempos inmemoriales (y no se si estará solucionado en ICS, pero desde luego en GB no lo está, imagino que en ICS tampoco) los Bitmap no entran en el recolector de basura.

Así que aunque carges una imagen de poco tamaño, si después cargas otra en el mismo sitio la memoria de la anterior no se limpia. Por lo que cuando lleves cargadas unas cuantas te volverá a saltar el error. Incluso usando Recycle sigue quedando basura, lo único que consigues es poder cargas unas cuantas imagenes más, pero al final te fallará.

Yo siempre que voy a usar un Bitmap ya por defecto le pongo un SoftReference, porque es la única forma que se 100% que el recolector de basura va a eliminar todo rastro de ese Bitmap en memoria.
Responder Con Cita
  #5  
Viejo 09/09/12, 17:16:17
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Los Bitmap sí entran en el recolector de basura como cualquier otro objeto (si no los SoftReferences no valdrían para nada). Con el recycle se libera la memoria de los datos gráficos, pero no el objeto en sí, que ese se elimina con el ciclo natural de recolección de basura.

Desde que me he acostumbrado a hacer un recycle y poner a null los bitmaps cuando ya no me hacen falta o no se van a ver, cero problemas.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #6  
Viejo 09/09/12, 17:42:55
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
El problema es, ¿cómo le pone SoftReferences o usa recycle() y pone a null cada Bitmap usando AppInventor?
Responder Con Cita
  #7  
Viejo 09/09/12, 17:49:09
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Los Bitmap sí entran en el recolector de basura como cualquier otro objeto (si no los SoftReferences no valdrían para nada). Con el recycle se libera la memoria de los datos gráficos, pero no el objeto en sí, que ese se elimina con el ciclo natural de recolección de basura.

Desde que me he acostumbrado a hacer un recycle y poner a null los bitmaps cuando ya no me hacen falta o no se van a ver, cero problemas.
Si entran, pero tienen una prioridad tan alta que practicamente es como si no entrasen, por eso hace falta el SoftReference para que funcione bien. La única forma en la que funciona medio bien (y no siempre), es si sales de la Activity, ahí si que pierde la referencia y tiende a borrarla, pero si sales y entras en otra que también demanda Bitmaps puedes volver a tener problemas de memoria, porque los Bitmap de la anterior Activity aún no se han eliminado.

Todo esto no hablo por hablar, hablo por experiencia con una aplicación que tenía demanda de muchísimos Bitmap. La única forma en la que lo solucioné (y sin Recycles ni nada) fue con SoftReference.

En cuanto a lo de hacer Recycle y poner a NULL, funciona muy bien si puedes controlarlo. Por ejemplo, tienes una Activity que cada vez que pulsas un botón te carga un nuevo Bitmap, ahí puedes controlarlo. Pero tienes otra Activity con un ListView que uno de sus elementos en cada fila es un Bitmap (por ejemplo la imagen de perfil de Twitter), ahí es muy dificil controlarlo, y puede ser que incluso no te interese controlarlo. Si tienes 100 "tuits" seguidos del mismo tio cada vez que vas a una nueva línea tendrías que volver a cargar los datos, es mejor que el sistema lo controle.
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 23:50:09 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /