![]() |
|
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
|
||||
|
||||
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(); 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! |
Gracias de parte de: | ||
|
#2
|
||||
|
||||
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 |
Los siguientes 2 usuarios han agradecido a kriogeN su comentario: | ||
#3
|
||||
|
||||
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 |
#4
|
||||
|
||||
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? |
Respuesta |
![]() |
||||||
|
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 17:50:35 (GMT +2)
HTCMania: líderes desde el 2007