Quiero mostrar la imagen de mapa de bits en ImageView desde la tarjeta SD que ya está almacenada. Después de ejecutar mi aplicación se bloquea y sale OutOfMemoryError error 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 memoria. Creo que el tamaño de mi imagen es muy grande, así que intenté cambiarlo.
Iterator<String> 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 del log log:
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)
android
android-bitmap
androidTag
fuente
fuente
Respuestas:
Error de memoria insuficiente 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) arroja 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 menciona Aleksey, puede agregar las siguientes entidades en su archivo de manifiesto
android:hardwareAccelerated="false"
,android:largeHeap="true"
funcionará para algunos entornos.definitivamente debería leer algunos de los conceptos del desarrollador de androides, especialmente aquí: mostrar mapas de bits de manera eficiente
Lea los 5 temas y vuelva a escribir su código. Si todavía no funciona, estaremos encantados de ver qué ha hecho mal con el material del tutorial.
Aquí algunas de las posibles respuestas para este tipo de errores en SOF
Android: BitmapFactory.decodeStream () sin memoria con un archivo de 400 KB con un montón libre de 2 MB
Cómo resolver problemas java.lang.OutOfMemoryError en Android
Android: java.lang.OutOfMemoryError
java.lang.OutOfMemoryError
Solución para OutOfMemoryError: el tamaño del mapa de bits excede el presupuesto de VM
Editar: De los comentarios de @cjnash
Para cualquier persona que todavía tenga fallas después de agregar esta línea, intente pegar su imagen en su carpeta res / drawable-xhdpi / en lugar de su res / drawable / y podría resolver su problema.
fuente
¿Has intentado agregar esto a tu manifiesto bajo aplicaciones?
android:largeHeap="true"
?Me gusta esto
fuente
Para mí, el problema era que mi archivo .png se estaba descomprimiendo para ser un mapa de bits realmente enorme en la memoria, porque la imagen tenía dimensiones muy grandes (aunque el tamaño del archivo era pequeño).
Entonces, la solución fue simplemente cambiar el tamaño de la imagen :)
fuente
android:hardwareAccelerated="false"
, algunas animaciones como la sombra de diseño no funcionaban. Pero después de cambiar el tamaño de todos los problemas se resolvieron gracias! ¡+1 por esta pista!En realidad, 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 esto.fuente
Esto debería funcionar
fuente
Cambie el tamaño de su imagen antes de la configuración a ImageView de esta manera:
donde el tamaño es el tamaño real de ImageView. Puede alcanzar el tamaño midiendo:
y use el siguiente tamaño
imageView.getMeasuredWidth()
yimageView.getMeasuredHeight()
parascaling
.fuente
Use Glide Library y Override size para reducir el tamaño;
fuente
Tengo debajo del error
después de añadir
android:largeHeap="true"
en AndroidManifest.xml entonces deshacerse de todos los erroresfuente
Solución: 1. abra su archivo de manifiesto 2. dentro de la etiqueta de la aplicación, simplemente agregue debajo de dos líneas
Ejemplo:
fuente
He resuelto este problema cambiando el tamaño de la imagen a un tamaño más bajo. Estoy usando la forma xamarin. La disminución del tamaño de la imagen PNG resolvió el problema.
fuente
He descubierto 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 se volverá a muestrear 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, puse todo en una carpeta drawable-nodpi (además de usar 'opciones' en BitmapFactory en función del montón de dispositivos en particular). No puedo permitirme que el tamaño de mi aplicación se hinche con múltiples carpetas dibujables, particularmente porque el rango de defs de pantalla es tan amplio ahora. Lo complicado es que el estudio ahora 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 suelta una imagen en esta carpeta en el estudio, ganará "
Asegúrese de hacer clic en la carpeta nodpi en el cuadro de 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 se equivocó. Studio recreó la vainilla 'dibujable' en algún momento para mí después de haberlo eliminado hace mucho tiempo:
fuente
Esto funcionó para mí: simplemente mueva las imágenes de la carpeta dibujable a drawable-hdpi.
fuente
Soluton intente esto en su archivo de manifiesto y use Glide Library
compile 'com.github.bumptech.glide: glide: 3.7.0'
android: hardwareAccelerated = "false"
android: largeHeap = "true"
Usa esta biblioteca
Está funcionando feliz codificación
fuente
agregar esto a su manifiesto en aplicaciones? android: largeHeap = "true"
fuente
Yo también tuve el problema.
Lo mismo con la mayoría de los anteriores. El problema es causado por una gran imagen.
Simplemente cambie el tamaño de algunas imágenes y no necesite cambiar ningún código.
fuente
En algunos casos (por ejemplo, operaciones en un bucle), el recolector de basura es más lento que su código. Puede usar un método auxiliar de esta respuesta para esperar al recolector de basura .
fuente
Soy un novato en el desarrollo de Android, pero espero que mi solución ayude, funciona perfectamente en mi condición. Estoy usando Imageview y establezco su fondo en "src" porque estoy tratando de hacer una animación de cuadro. Recibí el mismo error pero cuando intenté codificar esto funcionó
fuente
Me encontré con este problema cuando no eliminé mi actividad anterior al pasar a una nueva actividad. Lo arreglé con
finish();
fuente
50/100 si uno usa 100, entonces la resolución original puede detener las aplicaciones por falta de memoria.
si 50 o menos de 100, esto será una resolución del 50% o menos de 100, por lo que evitará problemas de memoria
fuente
Tienes que cambiar el tamaño del objeto en dibujable. Es demasiado grande para que lo muestre Android. Por ejemplo, si está configurando una imagen, pruebe con menos píxeles. Esto funciona para mi. Gracias. :)
fuente
Su aplicación se bloquea porque el tamaño de su 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
Después de agregar esta aplicación no se bloqueará.
fuente
Mi problema se resolvió después de agregar
en el archivo Build.Gradle
fuente
fuente
Si carga una imagen, intente reducir la calidad de la imagen, que es el segundo parámetro del mapa de bits. Esta fue la solución en mi caso. Anteriormente era 90, luego probé con 60 (como está en el código a continuación ahora).
fuente
Prueba el más simple. Tal vez su aplicación se está bloqueando 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 visualización o si está tomando una imagen de la galería en el tiempo de ejecución que antes de guardarla, comprima su mapa de bits. Funcionó para mi. Definitivamente para usted será.
fuente
Luego, en la etiqueta Appliaction, agregue largeheapsize = "true
fuente
Supongo que quieres usar esta imagen como un icono. Como Android te está diciendo, tu imagen es demasiado grande. Lo que solo necesita hacer es escalar su imagen para que Android sepa qué tamaño de la imagen usar y cuándo según la resolución de la pantalla. Para lograr esto, en Android Studio: 1. haga clic derecho en la carpeta res, 2. seleccione Image Asset 3. Seleccione icon Type 4. Asigne un nombre al icono 5. Seleccione Image on Asset Type 6. Recorte su imagen Haga clic en Siguiente y termine . En su código fuente o xml, simplemente consulte la imagen que ahora se ubicará en la carpeta de diseño o mipmap según el tipo de activo seleccionado. El error desaparecerá.
fuente
Realmente no recomiendo editar manifiestos como este
Estas opciones causan un efecto de animación no uniforme en su aplicación. Además, 'liveData' o cambiando su DB local (Sqlite, Room) se activan lentamente. Es malo para la experiencia del usuario.
Entonces recomiendo RESIZE bitmap
A continuación se muestra el código de muestra
fuente
Si android: largeHeap = "true" no funcionó para usted, entonces
1:
2:
¡No elimine android: largeHeap = "true"!
fuente
Use una biblioteca de carga de imágenes como Picasso o Glide . El uso de estas bibliotecas evitará bloqueos en el futuro.
fuente