Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android Bitmap.createScaledBitmap arroja java.lang.OutOfMemoryError sobre todo en Jelly Bean 4.1

El propósito principal de mi aplicación es mostrar imágenes de la siguiente manera como se muestra en la imagen

Introduzca aquí la descripción de la imagen

private void setSelectedImage(int selectedImagePosition) { BitmapDrawable bd = (BitmapDrawable) drawables.get(selectedImagePosition); Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false); selectedImageView.setImageBitmap(b); selectedImageView.setScaleType(ScaleType.FIT_XY); } 

El código detallado se puede encontrar aquí

Excepción se lanza en la línea siguiente

 Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false); 

La función anterior se llama desde onItemSelected . ** La aplicación sigue funcionando bien en 2.2 y 2.3, pero lanza la excepción inmediatamente en 4.1 El código anterior funciona bien, pero lanza la excepción siguiente. No vi ningún accidente en 2.2 y 2.3, pero immedidately se bloquea en 4.1 ¿Hay alguna diferencia importante de la gestión de la memoria en los granos de jalea? **:

 java.lang.OutOfMemoryError AndroidRuntime(2616): at android.graphics.Bitmap.nativeCreate(Native Method) AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:640) AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:586) AndroidRuntime(2616): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466) AndroidRuntime(2616): at com.rdx.gallery.GalleryDemoActivity.setSelectedImage(GalleryDemoActivity.java:183) 

3 Solutions collect form web for “Android Bitmap.createScaledBitmap arroja java.lang.OutOfMemoryError sobre todo en Jelly Bean 4.1”

http://www.youtube.com/watch?v=_CruQY55HOk . Después de los datos de píxeles de andorid 3.0 bitmaps se almacenan en el montón. Parece que está superando el tamaño de la memoria heap. El hecho de que su aplicación requiere gran montón no utilice gran montón. Más el tamaño de montón, más regular recolecciones de basura. El video tiene una buena explicación sobre el tema.

También recicle bitmaps cuando no esté en uso. Las recolecciones de basura en el montón se hacen mi marca y barrido, por lo que cuando recicle mapas de bits que la memoria libre. Por lo tanto, el tamaño del montón no crecerá y quedará sin memoria.

  bitmap.recycle(); 

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html . Documentación sobre la carga eficiente de mapas de bits. Echa un vistazo a la carga de la versión reducida en la memoria.

Aparte de esto, puede utilizar Universal Image Loader. https://github.com/nostra13/Android-Universal-Image-Loader .

https://github.com/thest1/LazyList . Carga perezosa de imágenes.

Ambos utilizan el almacenamiento en caché.

Es importante tener en cuenta que el código siguiente puede causar excepción:

 Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); oldBitmap.recycle(); 

Correcto es:

 Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); if (oldBitmap!= bitmap){ oldBitmap.recycle(); } 

Porque la documentación dice:

Si el ancho y la altura especificados son los mismos que el ancho y la altura actuales del btimap de origen, se devuelve el mapa de bits de origen y se crea un nuevo mapa de bits.

Usted está intentando tener acceso a más memoria entonces usted tiene. Tratar de usar

  BitmapFactory.Options opts=new BitmapFactory.Options(); opts.inDither=false; opts.inSampleSize = 8; opts.inPurgeable=true; opts.inInputShareable=true; opts.inTempStorage=new byte[16 * 1024]; Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1) , 65,65, true), 

También mire debajo de los enlaces para aumentar la memoria

http://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

Detectar tamaño de montón de aplicaciones en Android

EDITAR 1

Trate de utilizar nostras image downloader, puede utilizarlo para mostrar la imagen en el almacenamiento local. Y administra muy bien la memoria …

https://github.com/nostra13/Android-Universal-Image-Loader

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.