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 09/02/12, 11:30:57
Avatar de timonoj
timonoj
Usuario invitado
Mensajes: n/a
 
Mensajes: n/a
Mencionado: comentarios
Tagged: hilos
Gestión de memoria haciendo un horizontalScrollView de imágenes

Buenas!

Estoy haciendo algunos tutoriales de Android, y concretamente estoy en uno que consiste en una lista de imágenes en horizontal, y un botón para ponerla de fondo de escritorio del móvil.
Por el momento la app arranca y cumple, pero para una vez. Veamos cómo sale esto (siguiendo las instrucciones del Boston tutorials esos de youtube):
El horizontalScrollView viene definido en el XML, tiene 5 imageViews cada uno con una imagen de 960x800. Si pongo un sexto imageView ya da FC por falta de memoria.
Entonces, cuando pulsas el botoncico, tengo escrito esto:

Código:
InputStream is = getResources().openRawResource(toPhone);
Bitmap background = BitmapFactory.decodeStream(is);
            try{
                getApplicationContext().setWallpaper(background);
            }catch(IOException e){
                e.printStackTrace();}
System.gc();
toPhone básicamente es el int que tiene la referencia a la imagen seleccionada, y el System.gc() es un inocente intento de liberar memoria, que tiene toda la pinta de estar ahí tranquilamente sacándose los mocos sin hacer nada. Esto funciona bien la primera vez. La segunda peta casi fijo, por pasarme de varas con la memoria.

De qué forma podría reducir recursos? O cómo hago para hacer una lista de imágenes en la que sólo estén cargadas las que se muestran en pantalla, y se liberen a continuación?

Mil gracias!
Responder Con Cita
Gracias de parte de:


  #2  
Viejo 09/02/12, 20:56:58
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
Bienvenido al maravilloso mundo de la malísima gestión de memoria que hace Android de los Bitmap.

Vamos a ir por partes:

1) Siempre que uses un Bitmap en Android asegurate de que lo haces en una WeakReference (buscate algún manual sobre esto si no lo conoces). Salvo que estés seguro, PERO SEGURO, SEGURO, SEGURO, de que nunca te va a fallar la memoria por culpa de los Bitmap que uses (cosa que suele ser NUNCA, salvo que trabajes con muy pocos Bitmap y siempre de poco tamaño)

2) El ScrollView, tanto en horizontal como en vertical, es una muy mal contenedor para guardar imagenes, para eso Android tiene el contenedor Gallery. Que te permitirá trabajar con Adapters y así podrás hacer una buena gestión de las WeakReferences (ver 1)

3) El System.gc() no vale para una puta mierda, es un error de novato (yo pasé por ahí) querer usarlo para ayudarte a gestionar la memoria de los Bitmap. Al ejecutar System.gc() le dices al sistema que libere memoria, pero en primer lugar no lo hace en ese momento, simplemente ve que le sugieres hacerlo y él lo hará cuando pueda (casi siempre eso significa nunca) y en segundo lugar no funciona con Bitmap porque no hace el recycle del Bitmap, que es lo que realmente te chupa la memoria. Lo suyo es trabajar con WeakReferences, ya que así cuando el sistema se queda sin memoria la liberará si o si.

Te aconsejo que busques algún manual para trabajar con Gallery, y si ya viene con las WeakReferences mejor aún, aunque luego es bastante fácil añadirlo si tienes claro el concepto de como funciona un Adapter. Posteriormente también puedes trabajar con un ListView, que es como el ScrollView solo que también funciona con Adapters, solo que pensados para trabajar de forma general en lugar de solo con imagenes.

Última edición por kriogeN Día 09/02/12 a las 21:01:07
Responder Con Cita
Los siguientes 2 usuarios han agradecido a kriogeN su comentario:
  #3  
Viejo 09/02/12, 23:59:48
Avatar de Gooler
Gooler Gooler no está en línea
Miembro del foro
Mensajes: 338
 
Fecha de registro: nov 2008
Mensajes: 338
Modelo de smartphone: Xiaomi Mi A1
Versión de ROM: Vanilla
Tu operador: Jazztel
Mencionado: 0 comentarios
Tagged: 0 hilos
Muchas gracias a ambos, tanto por la pregunta como por la respuesta porque ando en la misma situacion con un Gallery, un adapter y cientos de jpgs de gran tamaño.

Aprovecharé el hilo e ire añadiendo enlaces y referencias a las soluciones que encuentre
Responder Con Cita
  #4  
Viejo 10/02/12, 10:13:17
Avatar de timonoj
timonoj
Usuario invitado
Mensajes: n/a
 
Mensajes: n/a
Mencionado: comentarios
Tagged: hilos
Muchísimas gracias, estaba haciendo otro tutorial con SurfaceView mientras esperaba, he conseguido hacer que una mierda de pelota de tenis rebote según dónde la dejes (el tutorial sólo explicaba cómo recolocar la pelota siguiendo el dedo, he hecho la tontería de añadir gravedad). Es una chorrada, pero joder qué orgulloso estoy de mi chorrada.
Ahora que me pilla el finde me va a dar pereza, pero a ver si aprendo a manejar los recursos de manera eficiente. Sabes de algún tutorial o algún sitio donde venga explicado cómo usar gallery y adapter?
Responder Con Cita
Respuesta

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


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: 17:50:35 (GMT +2)

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