|
||
|
![]() |
![]() |
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 |
![]() |
|
Herramientas |
#1
|
||||
|
||||
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! |
|
#2
|
||||
|
||||
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. |
#3
|
||||
|
||||
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. |
#4
|
||||
|
||||
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. ![]() 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. |
#5
|
||||
|
||||
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!
|
#7
|
||||
|
||||
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. ![]() 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. |
![]() |
![]() |
||||||
|