2011-04-01 13 views
7

En mis usuarios de la aplicación elegir las imágenes y el programa permite a los usuarios realizar cambios en las imágenes. Como hay muchos dispositivos Android diferentes, mi programa falla en algunos dispositivos que tienen menos tamaño de almacenamiento dinámico. Quiero calcular las dimensiones de mejor ajuste para el teléfono del usuario para que no se bloquee debido al presupuesto de VM. He agregado una captura de pantalla de "Picsay Pro" que está haciendo exactamente lo que estoy buscando. Yo sé de los "BitmapFactory.Options" mi único problema es encontrar una manera de decidir dimensiones de imagen que no dejan que bloquee la aplicación del presupuesto porque VM.¿Cómo elegir el tamaño de imagen óptimo para no exceder el presupuesto de VM?

enter image description here

Respuesta

12

calcular el espacio libre que queda en el teléfono:

long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());

donde,

Runtime.getRuntime() .maxMemory() - Devuelve el tamaño límite Montón total (en bytes).

Debug.getNativeHeapAllocatedSize() - devuelve la cantidad de datos que ya ha utilizado su aplicación (en Bytes).

Calcular el tamaño del mapa de bits que está utilizando esta fórmula,

long Bytes_allocated = (height of the Image) * (width of the Image) * 4;

freeMemory Compare y Bytes_allocated para seleccionar el tamaño apropiado para su aplicación.

1

verdad es que acabé la compresión de imágenes en el teléfono por dos razones. Una era la velocidad de carga y otra era problemas de pila. ¡Puedes intentar hacer algo similar, o al menos publicar el seguimiento de la pila!

0

Hasta ahora no he encontrado ninguna manera confiable para hacer frente a tamaño de la imagen frente a la memoria disponible. El problema es que la memoria se fragmenta rápidamente, por lo que podría tener 10 MB libres, pero no espacio contiguo para una imagen de 2 MB. Lo que realmente se necesita es el tamaño del espacio libre más grande, pero no parece haber ninguna forma de conseguirlo. Mejor sería una forma de desfragmentar la memoria, pero tampoco existe esa función para esto.

Aún si la memoria disponible es inferior a la de la imagen, puede estar seguro de que se va a bloquear si intenta usarla, por lo que tiene algún mérito que al menos verificar antes de usarla.

Con las tabletas finales de 2012 teniendo ahora 1920x1280 de resolución, ahora tenemos 20 MB de memoria continua en una sola imagen de fondo para! Parece que algunas de estas tabletas ahora permiten montones de hasta 256MB, pero mientras tiramos más espacio de VM aparentemente lo resuelve, realmente necesitamos un desfragmentador de memoria o una forma de reservar espacio.

hay un truco que podría ayudar si el tamaño de la imagen no se escala o se modifica, y cada imagen modificada es del mismo tamaño y están limitando su aplicación a Android 3.0+:

Options opt2 = new BitmapFactory.Options(); 
opt2.inBitmap = mBitmap;  // reuse mBitmap to reduce out of memory errors 
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2); 

Esto reutilizará la misma área de memoria mBitmap para la imagen.

Cuestiones relacionadas