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  
Viejo 25/01/14, 21:57:49
Avatar de Dild0
Dild0 Dild0 no está en línea
Usuario muy activo
Mensajes: 860
 
Fecha de registro: may 2009
Mensajes: 860
Versión de ROM: CyanogenMOD
Tu operador: Pepephone
Mencionado: 3 comentarios
Tagged: 0 hilos
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
Responder Con Cita


  #2  
Viejo 25/01/14, 22:29:01
Avatar de Arasthel
Arasthel Arasthel no está en línea
Cocinero veterano
Mensajes: 1,946
Compra y venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Versión de ROM: DroidKang
Tu operador: Amena
Mencionado: 393 comentarios
Tagged: 1 hilos
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.
Responder Con Cita
  #3  
Viejo 25/01/14, 23:34:11
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Cita:
Originalmente Escrito por Arasthel Ver Mensaje
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.
Universal Image Loader usa SoftReference internamente, al no ser que le digas que quieres usar WeakReference cuando la configuras.

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.
Responder Con Cita
Gracias de parte de:
  #4  
Viejo 25/01/14, 23:54:46
Avatar de Dild0
Dild0 Dild0 no está en línea
Usuario muy activo
Mensajes: 860
 
Fecha de registro: may 2009
Mensajes: 860
Versión de ROM: CyanogenMOD
Tu operador: Pepephone
Mencionado: 3 comentarios
Tagged: 0 hilos
Muchisimas gracias me pondré con ello a ver que consigo,

Gracias por la enseñanza
Responder Con Cita
Respuesta

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

Herramientas

Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 22:44:02 (GMT +2)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007