Android: java.lang.OutOfMemoryError: no se pudo asignar una asignación de 23970828 bytes con 2097152 bytes libres y 2MB hasta OOM

Quiero mostrar la imagen de bitmap en ImageView desde la tarjeta SD que ya está almacenada. Después de ejecutar mi aplicación se bloquea y obteniendo el error OutOfMemoryError de:

(java.lang.OutOfMemoryError: no se pudo asignar una asignación de 23970828 bytes con 2097152 bytes libres y 2 MB hasta OOM)

No tengo idea o por qué está fuera de la memoria. Creo que el tamaño de mi imagen es muy grande, así que traté de cambiarlo.

Iterator it = imageArray.iterator(); while (it.hasNext()) { Object element = it.next(); String objElement = element.toString(); Log.e("objElement ", " = " + objElement); final ImageView imageView = new ImageView (getContext()); final ProgressBar pBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyleSmall); imageView.setTag(it); pBar.setTag(it); imageView.setImageResource(R.drawable.img_placeholder); pBar.setVisibility(View.VISIBLE); if (objElement.endsWith(mp3_Pattern)) { Log.e("Mp3 ", " ends with "); pBar.setVisibility(View.GONE); imageView.setImageResource(R.drawable.audio_control); } if (objElement.endsWith(png_Pattern)) { Bitmap bitmap = BitmapFactory.decodeFile(objElement); int size = Math.min(bitmap.getWidth(), bitmap.getHeight()); int x = (bitmap.getWidth() - size) / 2; int y = (bitmap.getHeight() - size) / 2; Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size); Log.e("bitmap_Resul "," = "+ bitmap_Resul); if (bitmap_Resul != bitmap) { bitmap.recycle(); } imageView.setImageBitmap(bitmap_Resul); Log.e("png_Pattern ", " ends with "); Log.e(" bitmap "," = " + bitmap); } holder.linearLayout.addView(imageView); holder.linearLayout.addView(pBar); 

La información de registro de gato:

 08-27 14:11:15.307 1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.tazeen.classnkk, PID: 1857 java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.Bitmap.nativeCreate(Native Method) at android.graphics.Bitmap.createBitmap(Bitmap.java:812) at android.graphics.Bitmap.createBitmap(Bitmap.java:789) at android.graphics.Bitmap.createBitmap(Bitmap.java:709) at android.graphics.Bitmap.createBitmap(Bitmap.java:634) at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357) at android.widget.AbsListView.obtainView(AbsListView.java:2347) at android.widget.ListView.makeAndAddView(ListView.java:1864) at android.widget.ListView.fillDown(ListView.java:698) at android.widget.ListView.fillFromTop(ListView.java:759) at android.widget.ListView.layoutChildren(ListView.java:1659) at android.widget.AbsListView.onLayout(AbsListView.java:2151) at android.view.View.layout(View.java:15671) at android.view.ViewGroup.layout(ViewGroup.java:5038) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) at android.view.View.layout(View.java:15671) at android.view.ViewGroup.layout(ViewGroup.java:5038) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android.view.View.layout(View.java:15671) at android.view.ViewGroup.layout(ViewGroup.java:5038) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) at android.view.View.layout(View.java:15671) at android.view.ViewGroup.layout(ViewGroup.java:5038) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android.view.View.layout(View.java:15671) at android.view.ViewGroup.layout(ViewGroup.java:5038) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:550) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

OutOfMemoryError es el problema más común que se produce en Android, especialmente cuando se trata de mapas de bits. La Máquina Virtual Java (JVM) lanza este error cuando no se puede asignar un objeto debido a la falta de espacio en la memoria y, además, el recolector de basura no puede liberar espacio.

Como lo mencionó Aleksey, puede agregar las siguientes entidades en su archivo de manifiesto android:hardwareAccelerated="false" , android:largeHeap="true" funcionará para algunos entornos.

  

definitivamente deberías leer algunos de los conceptos del desarrollador de androids, especialmente aquí: mostrar mapas de bits de manera eficiente

Lee los 5 temas y vuelve a escribir tu código. Si todavía no funciona, estaremos encantados de ver lo que has hecho mal con el material del tutorial.

Aquí algunas de las respuestas posibles para este tipo de errores en SOF

Android: BitmapFactory.decodeStream () sin memoria con un archivo de 400 KB con 2 MB de espacio libre

Cómo solucionar problemas de java.lang.OutOfMemoryError en Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Solución para OutOfMemoryError: el tamaño del bitmap excede el presupuesto de VM

Editar: De los comentarios de @cjnash

Para cualquier persona que todavía tuviera fallas después de que agregaron esta línea, intente pegar su imagen en su carpeta res / drawable-xhdpi / en lugar de su res / dibujable / y podría resolver su problema.

¿Has intentado agregar esto a tu manifiesto en las aplicaciones? android:largeHeap="true" ?

Me gusta esto

   

De hecho, puede agregar en su manifiesto estas líneas android:hardwareAccelerated="false" , android:largeHeap="true" , está funcionando para algunas situaciones, pero tenga en cuenta que la otra parte del código puede estar discutiendo con esto.

  

Para mí, el problema era que mi archivo .png estaba siendo descomprimido para ser un bitmap realmente enorme en la memoria, porque la imagen tenía dimensiones muy grandes (aunque el tamaño del archivo era muy pequeño).

Entonces la solución fue simplemente cambiar el tamaño de la imagen 🙂

Esto debería funcionar

  BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; mBitmapInsurance = BitmapFactory.decodeFile(mCurrentPhotoPath,options); 

Cambiar el tamaño de su imagen antes de la instalación de ImageView como este:

 Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false); 

donde el tamaño es el tamaño real de ImageView. Puede alcanzar el tamaño midiendo:

 imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

y use el siguiente tamaño imageView.getMeasuredWidth() y imageView.getMeasuredHeight() para scaling .

Use la biblioteca Glide y anule el tamaño a menos tamaño;

 Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView); 

He resuelto este problema cambiando el tamaño de la imagen a un tamaño más bajo. Estoy usando la forma de xamarin. la disminución del tamaño de la imagen PNG resolvió el problema.

Tengo un error debajo

“E / art: Throwing OutOfMemoryError” Error al asignar una asignación de bytes 47251468 con 16777120 bytes libres y 23MB hasta OOM ”

después de agregar android:largeHeap="true" en AndroidManifest.xml, entonces android:largeHeap="true" todos los errores

  

Soluton intente esto en su archivo de manifiesto y use la Biblioteca Glide

compile ‘com.github.bumptech.glide: deslizamiento: 3.7.0’

  **Use Glide Library and Override size to less size;** if (!TextUtils.isEmpty(message.getPicture())) { Glide.with(mContext).load(message.getPicture()) .thumbnail(0.5f) .crossFade() .transform(new CircleTransform(mContext)) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(holder.imgProfile); } 

android: hardwareAccelerated = “falso”

android: largeHeap = “verdadero”

  

Usa esta biblioteca

  compile 'com.github.bumptech.glide:glide:3.7.0' 

Su trabajo Happy Coding

 import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Paint; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; public class CircleTransform extends BitmapTransformation { public CircleTransform(Context context) { super(context); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); } private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; // TODO this could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public String getId() { return getClass().getName(); } } 

Problema: no se pudo asignar una asignación de bytes de 37748748 con 16777120 bytes libres y 17 MB hasta OOM

Solución: 1. abra su archivo de manifiesto 2. dentro de la etiqueta de la aplicación solo agregue debajo de dos líneas

  android:hardwareAccelerated="false" android:largeHeap="true" 

Ejemplo:

   

Yo también tuve el problema.

Lo mismo con la mayoría de los anteriores. El problema es causado por una gran imagen.

Solo cambia el tamaño de algunas imágenes, y no es necesario cambiar ningún código.

Soy un novato en desarrollo de Android pero espero que mi solución me ayude, funciona perfectamente en mi condición. Estoy usando Imageview y configuré su fondo para “src” porque estoy tratando de hacer una animación de cuadros. Obtuve el mismo error pero cuando traté de codificar esto funcionó

 int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName); imgView.SetImageResource(ImageID); AnimationDrawable animation = (AnimationDrawable)imgView.Drawable; animation.Start(); animation.Dispose(); 

En algunos casos (por ejemplo, operaciones en un bucle), el recolector de basura es más lento que tu código. Puede usar un método auxiliar de esta respuesta para esperar al recolector de basura .

Me encontré con este problema cuando no maté mi actividad anterior cuando pasé a una nueva actividad. Lo arreglé con finish();

  Intent goToMain = new Intent(this,MainActivity.class); startActivity(goToMain); finish(); 

Esto funcionó para mí: simplemente mueve las imágenes de la carpeta dibujable a drawable-hdpi.

 Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap(); ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream); 

50/100 si uno usa 100, la resolución original puede detener las aplicaciones por falta de memoria.

si 50 o menos de 100 esto será 50% o menos de 100 de resolución, esto evitará problemas de memoria agotada

Descubrí que las imágenes en la carpeta ‘dibujable’ se convertirán en una imagen mucho más grande en teléfonos de alta definición. Por ejemplo, una imagen de 200k será remuestreada a una resolución más alta, como 800k o 32000k. Tuve que descubrir esto por mi cuenta y hasta la fecha no he visto documentación para esta trampa de memoria de montón. Para evitar esto pongo todo en una carpeta drawable-nodpi (además de usar ‘opciones’ en BitmapFactory en función del montón de dispositivo particular). No puedo darme el lujo de tener el tamaño de mi aplicación abotagado con múltiples carpetas dibujables, particularmente porque el rango de definición de pantalla es tan vasto ahora. Lo difícil es que ahora el estudio no indica específicamente la carpeta ‘drawable-nodpi’ como tal en la vista del proyecto, solo muestra una carpeta ‘dibujable’. Si no tiene cuidado, cuando suelte una imagen en esta carpeta en el estudio, no se dejará caer en el dibujo-nodpi:

 Careful here 'backgroundtest' did not actually go to drawable-nodpi and will be resampled higher, such as 4x or 16x of the original dimensions for high def screens. 

enter image description here

Asegúrese de hacer clic en la carpeta nodpi en el diálogo, ya que la vista del proyecto no le mostrará todas las carpetas dibujables por separado como solía hacerlo, por lo que no será inmediatamente evidente que fue a una incorrecta. Studio recreó el “drawable” de vanilla en algún momento para mí después de haberlo borrado hace mucho tiempo:

enter image description here

Tienes que cambiar el tamaño del objeto en drawable. Es demasiado grande para que se muestre Android. Por ejemplo, si está configurando la imagen, intente la imagen con menos píxeles. Esto funciona para mi. Gracias. 🙂

Si carga una imagen, intente reducir la calidad de la imagen, que es el segundo parámetro del bitmap. Esta fue la solución en mi caso. Anteriormente era 90, luego probé con 60 (como está ahora en el código siguiente).

 Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream); ByteArrayOutputStream baos = new ByteArrayOutputStream(); finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos); byte[] b = baos.toByteArray(); 

Prueba el más simple. Tal vez su aplicación se cuelga porque el tamaño de su imagen (en MB) es demasiado grande por lo que no está asignando espacio para eso. Entonces, antes de pegar su imagen en dibujable, simplemente reduzca el tamaño con cualquier software de visor o si está tomando una imagen de la galería en el tiempo de ejecución que antes de guardarla comprima su bitmap. Funcionó para mí Definitivamente para ti lo será.

Tu aplicación se está bloqueando porque el tamaño de tu imagen (en MB o KB) es demasiado grande por lo que no está asignando espacio para eso. Entonces, antes de pegar su imagen en dibujable, simplemente reduzca el tamaño.

O

Puede agregar Siguiente en la etiqueta de la aplicación en Manifest.xml

  android:hardwareAccelerated="false" android:largeHeap="true" android:allowBackup="true" 

Después de agregar esta aplicación, no se bloqueará.

  • siempre use imágenes de menor tamaño en la aplicación.
  • Si agrega imágenes de gran tamaño en la aplicación, debe agregar la syntax anterior, pero el tamaño de la aplicación boostá.

Mi problema fue resuelto luego de agregar

  dexOptions { incremental true javaMaxHeapSize "4g" preDexLibraries true dexInProcess = true } 

en el archivo Build.Gradle