![]() |
|
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 |
«
Tema Anterior
|
Siguiente tema
»
|
Herramientas |
#1
|
||||
|
||||
outofmemory en listview
Hola, no se si os abreis topado con el problema de out of memory en l carga de listview con imagenes
Tengo un listview personalizado con imagenes textos y botones. Tengo una clase con Bitmap String String Button Y lo voy cargando al adpter El problema viene con los bitmap (los cuales cargo de un directorio de la sd) Como tenga bastantes items en la lista hace un out of memory y las imagenes no ocupan mas de 30kb Como solventar este problema??? Entiendo que al cargar 50 items en memoria con su correspondiente imagen peta pero como solventar este escollo Un saludo |
|
#2
|
||||
|
||||
Yo normalmente cargo las imágenes de forma asíncrona con alguna librería para evitarme el tener que usar WeakReferences y la caché y el liberar memoria consumida por los Bitmaps. Por ejemplo, Universal Image Loader te permite cargar las imágenes ocupándose de todo y además pudiendo decirle cuánto puede ocupar la caché de imágenes en memoria.
Probablemente en tu caso lo que ocurra es que aunque se reciclen las Views del ListView los Bitmaps asociados a ellas se mantengan en memoria por si se vuelven a utilizar. Además, ten en cuenta que una imagen que ocupa 30kb como jpg (quizás reescalada a un tamaño mayor) y como bitmap, es decir, sin ningún tipo de compresión, pueden ser varios megas. Yo he visto jpgs de 50kb pasar a ser bitmaps de 14MB en un Nexus 5 sin problemas. Si no quieres tirar de librería yo intentaría llevar una caché de imágenes donde se almacenen las imágenes usadas recientemente y que al salir una de dicha caché se elimine totalmente de memoria. Un saludo y suerte, las imágenes en Android pueden ser un problema bastante gordo. |
#3
|
||||
|
||||
Cita:
Yo antes también usaba Universal Image Loader, hasta que termine cansado de sus enormes bugs en determinadas tareas, y a pesar de que lo han puesto en los fallos de la librería en GitHub el programador se limita a cerrar los hilos porque dice que él no consigue reproducirlo, yo si lo he conseguido y varias veces. Por ejemplo uno de ellos es al cargar las imágenes en un ViewPager infinito, mostrando un spinner mientras la imagen está cargando, cuando la imagen termina de cargar no aparece. Lo busqué en las "issues" cerradas y había uno que le pasaba lo mismo, nostra13 había cerrado el hilo porque decía que habían pasado 2 semanas y nadie más había comunicado ese fallo. Creo que ocurre por el sistema que tiene UIL de asignar las imágenes a los ImageView, fuera del hilo principal. Ahora uso Volley, que es la librería oficial de Google para tareas asíncronas, incluida la carga de imágenes remotas. Y también te permite construirte tu propia cache LRU. Necesitando muchas menos líneas de código que UIL para terminar haciendo lo mismo. Lo único que hecho de menos de UIL son 2 cosas: 1) Su sistema combinado de MemoryCache y DiskCache, que técnicamente también es posible hacerlo con Volley, pero cuando lo he intentando nunca lo he conseguido hacer funcionar. Ahora uso mi propia cache DiskCacheLRU. 2) Que los procesos de carga de imágenes sean en pila y no en cola, supongo que también se podría hacer con Volley jugando con el ThreadPoolExecutor, o a lo mejor ya existe, hace 6 meses que no actualizo la librería. |
Gracias de parte de: | ||
#4
|
||||
|
||||
Muchisimas gracias me pondré con ello a ver que consigo,
Gracias por la enseñanza |
Respuesta |
![]() |
||||||
|
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 23:42:43 (GMT +2)
HTCMania: líderes desde el 2007