Spanish Galeria Imagenes

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

En la app que estoy desarrollando quiero poner un apartado para que los usuarios suban imagenes, mi gran duda es que cuando se muestren las imagenes, si hay bastantes puede dar problemas de memoria,tardar en cargar, etc. En apps como facebook o twitter veo que cargan las últimas y después va actualizando y va mostrando el resto.
Hay algún ejemplo sobre este tema?
Como me recomendariais hacerlo?

Muchas gracias
 

JordiCP

Expert
Licensed User
Longtime User
Existe una opción de pago, UltimateListView de @Informatix, que soporta la carga asíncrona de imágenes desde server (creo que viene con algún ejemplo concreto), además de muchas otras cosas. Yo la utilizo y está muy bien, aunque no he utilizado esta opción.

En cuanto a librerías "free", hay un ejemplo com CustomListView que baja imágenes de una página antes de insertarlas en el CustomListView, pero no sé si hace la gestión que comentas automáticamente o bién las carga todas y después las muestra. Si es así y prefieres utilizar esta librería, tendrías que adaptar el código a tus necesidades.
Como consejo si haces la gestión tu mismo, carga y mantén en memoria las imágenes solamente del tamaño que necesites, pues tenerlas en el tamaño original (si es mayor) para presentarlas después por ejemplo en un panel de 400x400 (por decir algo) es una de las primeras causas de problemas de memoria.

Quizás alguien más se haya encontrado con el mismo problema...
 

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

Lo primero de todo Jordi muchas gracias por contestar.
Para la descarga y muestra de imagenes no tengo problemas, en otras pantallas de mi APP ya lo hago.
Mi gran duda es para la nueva pantalla de mi app ya que puede tener miles de imagenes y no sé como realizar la carga "por partes" de todas esas imagenes. No sé si me explico. Lo intento desarrollar:

Si tiene que mostrar 500 imagenes me gustaría que descargase 50 y una vez llegado al fin del scroll descargase otras 50 y así hasta llegar a las 500.
Si el usuario ha visualizado 200 la siguiente vez que entrase me gustaría que no tuviese que descargar otra vez esas 200.

Buf no sé si me entiendes
 

JordiCP

Expert
Licensed User
Longtime User
Sí, queda claro. Deberías tener un 'pool' de imágenes, por ejemplo en un 'Map', donde la 'key' sea el índice y el 'Value' el bitmap. Suponemos que el máximo que quieres tener en memoria son 500

Al principio cargas 50. Cuando el usuario llega al final del scroll, cargas 50 más. Si el usuario sigue haciendo scroll, cargas 50 más y así todo el rato.... hasta aquí correcto.

Ahora bien: si has llegado a cargar 500, o el máximo que tengas establecido, y el usuario sigue haciendo scroll, necesitarás 50 más. Pero como no puedes tener más de 500 en memoria, necesitarás eliminar algunas. Estas deben ser las más "antiguas", o las que estén a mayor distancia de tu índice de scroll actual.

Cómo hacerlo: Por un lado tienes un 'Map'. Por otro lado (por comodidad) puedes guardar el índice mínimo y máximo de los bitmaps que en teoría están pedidos.
Así, cada vez que necesites llenar una casilla de tu scroll, vas a buscar si está en tu map (utilizas el índice como 'key').
  • Si el índice está entre el mínimo y el máximo, y
    • SÍ está en el map --> obtenemos el bitmap y ya está
    • NO está en el map --> significa que está 'pedido' pero todavía no ha llegado. Aquí sería necesaria una gestión por tiempo o reintento.
  • Si el índice NO està entre el mínimo y el máximo y
    • El Map todavía no está 'lleno' : Suponemos que tenemos del 0 al 249 y queremos llenar el 250. Como está fuera de límites significa que no lo hemos pedido todavía. Lanzamos la descarga de 50 más, y aumentamos el máximo en 50 unidades
    • El Map ya está 'lleno' : suponemos que tenemos minimo = 100 y máximo = 599 y queremos el índice 99. Esto significa que estamos haciendo scroll hacia las primeras posiciones de la lista después de haber bajado mucho. Ahora los 50 más antiguos serán del 550 al 599. Los eliminamos del map, y pedimos del 50 al 99. También cambiamos el valor del mínimo para reflejarlo.
Quizás haya suerte y ya exista alguna código por el foro que haga esta gestión. Pero tampoco es nada complejo y, bien implementado, hará lo que necesitas.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Te recomiendo, que ademas de lo que te ha comentado JordiCP, cuando cargues la imagen, en vez de cargarla sin mas:

B4X:
Imagen.Bitmap=LoadBitmap(Dir,NombreFile)

Lo hagas de esta forma:

B4X:
Imagen.Bitmap=LoadBitmapSample(DirActual,NombreFiles.Get(i),Máximo Ancho,Máximo Alto)

Así no cargas tanto la memoria. En los maximo de ancho y alto puedes darle el valor que creas conveniente, o por ejemplo jugar con tantos por cientos de la pantalla del dispositivo hasta que la imagen se vea razonablemente bien, algo asi:

B4X:
Imagen.Bitmap=LoadBitmapSample(DirActual,NombreFiles.Get(i),15%x,15%y)

Saludos
 
Top