|
||
|
![]() |
![]() |
Avisos |
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
|
||||
|
||||
Cargar ImageView como Facebook
Muy buenas foro, estoy realizando una aplicación que muestra de 1 - N ImageView, pero como es normal me sale el tan sufrido OOM (OutOfMemory) y he decidido se que los imageview se cargen como en el facebook, es decir, que cuando se este mostrando en pantalla el imageview este esté cargado pero sino se muestre que desaparezca de memoria y cuando vuelva a entrar en la pantalla se vuelva a cargar,
¿alguien tiene o sabe como puedo desarrollar esto? Un Saludo. y Mil Gracias. |
|
#2
|
||||
|
||||
Teóricamente si usas un ListView (o GridView, o derivados) el sistema te lo debe gestionar automáticamente, aunque hay veces que sigue dejando mierda y termina dando el error, pero tarda más en producirse.
La mejor forma para evitar estos errores es usar SoftReference o WeakReference, aunque hay mucha gente que dice que es una mala solución y es mejor controlar el Bitmap y hacer los disposes a mano, pero yo todos los errores que he tenido con muchos Bitmaps los he terminado solucionando siempre con SoftReference. Otra cosa es que si estás usando la clase Gallery o HorizontalScrollView, da igual lo que hagas, la gestión de memoria de los Bitmap tendrás que hacerla a mano y aún así es muy costosa. Ya que esas 2 clases no tienen reutilización de vista, lo que no está en pantalla sigue en memoria. |
#3
|
||||
|
||||
Gallery
Antetodo gracias, estoy utilizando la clase Gallery y estoy creando la tipica galeria con reflección y cuando son muchos bitmap dan el error OOM, tienes un ejemplo para esto no me ocurra, mira mi codigo es este:
try { bitmapWithReflection = Bitmap.createBitmap(nWidth,nHeigth, Config.ARGB_8888); } catch(OutOfMemoryError E) { Log.d("ANDRO_ASYNC",String.valueOf(E.getMessage()) ); } Gracias |
#4
|
||||
|
||||
Es lo que te he dicho, usando Gallery es muy difícil controlarlo.
Prueba usando SoftReference, a ver como se comporta. |
#5
|
||||
|
||||
Tendrias un ejemplo de como utilizar SoftReference?
Gracias |
#6
|
||||
|
||||
Es fácil, metes el Bitmap dentro de un objeto SoftReference, y luego cada vez que quieras usarlo lo sacas de ahí. Haciendo esto cuando Android necesite memoria lo primero que va a hacer es eliminar las imágenes que no necesite. Si aún así te sigue dando problemas cámbialo por WeakReference.
Con tu ejemplo: bitmapWithReflection = new SoftReference<Bitmap>(Bitmap.createBitmap(nWidth,n Heigth, Config.ARGB_8888)); El objeto bitmapWithReflection tendrá que ser de tipo SoftReference<Bitmap> Y en los sitios donde lo uses tendrás que usar: bitmapWithReflection.get() Si haces comparaciones nulas con el objeto en algún sitio, ten en cuenta que puede ser nulo tanto el SoftReference como su contenido, es decir, en tu caso puede ser nulo bitmapWithReflection o bitmapWithReflection.get(). El segundo caso ocurrirá cuando Android lo haya eliminado de la memoria por necesitarla, el objeto SoftReference sigue vivo, pero su contenido se ha vaciado. |
#7
|
||||
|
||||
Gracias, lo he probado con Soft... y Weak... y sigue pasando lo mismo, tienes alguna otra idea que pueda desarrollar, yo he pensado cargar solo unas 10 imagenes y cuando llegue al final carge otras 10 y así sucesivamente, sabrias algo mejor ? y si ves buena opcion lo de cargar 10 imagenes sabrias, como implementar esto con una clase extends BaseAdapter, es decir, si la carga de estas imagenes con sucesivas cargas las tendria que realizar en mi clase:
ImageAdapter extends BaseAdapter Gracias. |
![]() |
![]() |
||||||
|