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


OutofMemoryError: el tamaño de mapa de bits supera el presupuesto de VM (Android)

Obtención de una excepción en BitmapFactory. No estoy seguro de cuál es el problema. (Bueno, puedo adivinar el problema, pero no estoy seguro de por qué sucede)

  ERROR / AndroidRuntime (7906): java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto de VM

 ERROR / AndroidRuntime (7906): en android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:295) 

Mi código es bastante sencillo. Definí un diseño XML w / una imagen predeterminada. Intento cargar un bm en la tarjeta SD (si está presente – es). Si no, muestra la imagen predeterminada. De todos modos .. Aquí está el código:

  • Android: fuente de anchura fija en AlertDialog
  • Esta versión de la aplicación no está configurada para la facturación a través de Google Play
  • Android usb requestWait no volver
  • ¿Es posible tener más de un archivo de recursos de cadena en Android?
  • Métodos de actividad: onCreate () y onDestroy ()
  • ¿Detectar la suplantación de ubicación en android?
  • public class showpicture extends Activity { public void onCreate(Bundle savedInstanceState) { /** Remove menu/status bar **/ requestWindowFeature(Window.FEATURE_NO_TITLE); final Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); Bitmap bm; super.onCreate(savedInstanceState); setContentView(R.layout.showpicture); try { ImageView mImageButton = (ImageView)findViewById(R.id.displayPicture); bm = Bitmap.createScaledBitmap(BitmapFactory.decodeFile("/sdcard/dcim/Camera/20091018203339743.jpg"),100, 100, true); parkImageButton.setImageBitmap(bm); } catch (IllegalArgumentException ex) { Log.d("MYAPP",ex.getMessage()); } catch (IllegalStateException ex) { 

    ¿ bm=Bitmap.createScaledBitmap en el bm=Bitmap.createScaledBitmap cualquier pensamiento? Hice algunas investigaciones en los foros, y señaló a este post que simplemente no sé por qué no está funcionando. Cualquier ayuda sería genial! Gracias,

    Chris.

  • Android: uso no válido de SingleClientConnManager: conexión aún asignada
  • ¿Se puede implementar en un dispositivo a través de Gradle desde la línea de comandos
  • ¿Es posible hacer que CursorAdapter se establezca en recycleview, al igual que ListView?
  • Escribir byte en Archivo en Java
  • Evitar que DialogFragment se rechace cuando se hace clic en el botón
  • Android - SwipeRefreshLayout con texto vacío
  • 9 Solutions collect form web for “OutofMemoryError: el tamaño de mapa de bits supera el presupuesto de VM (Android)”

    InSampleSize es una buena pista. Pero un valor fijo a menudo no funciona bien, ya que los mapas de bits grandes de los archivos suelen ser archivos de usuario, que pueden variar desde minúsculas miniaturas a imágenes de 12MP de la cámara digital.

    Aquí hay una rutina de carga rápida y sucia. Sé que hay margen de mejora, como un mejor bucle codificado, con potencias de 2 para una decodificación más rápida, y así sucesivamente. Pero es un comienzo de trabajo …

     public static Bitmap loadResizedBitmap( String filename, int width, int height, boolean exact ) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile( filename, options ); if ( options.outHeight > 0 && options.outWidth > 0 ) { options.inJustDecodeBounds = false; options.inSampleSize = 2; while ( options.outWidth / options.inSampleSize > width && options.outHeight / options.inSampleSize > height ) { options.inSampleSize++; } options.inSampleSize--; bitmap = BitmapFactory.decodeFile( filename, options ); if ( bitmap != null && exact ) { bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false ); } } return bitmap; } 

    Por cierto, en las API más recientes también hay un montón de BitmapFactory.Option para ajustar la imagen a la pantalla DPIs, pero no estoy seguro de si realmente simplificar nada. Uso de android.util.DisplayMetrics.density o simplemente un tamaño fijo para menos consumo de memoria parecen funcionar mejor imho.

    Con referencia a este enlace , tenga en cuenta que el error outOfMemory se puede solucionar de la siguiente manera:

     public Bitmap decodeFile(String filePath) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true; try { BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(filePath != null) { bitmap = BitmapFactory.decodeFile(filePath, options); } return bitmap; } 

    Asegúrese de proteger su creación de mapa de bits de errores de memoria! Con la mayoría de las plataformas, android no tiene mucha memoria para jugar y se ejecuta rápidamente con mapas de bits. Además, asegúrese de reciclar manualmente sus mapas de bits tanto como sea posible, he notado que la recolección de basura puede ser bastante lenta.

     try{ Bitmap myFragileBitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888); } catch(IllegalArgumentException e){ Log.e(TAG,"Illegal argument exception."); } catch(OutOfMemoryError e){ Log.e(TAG,"Out of memory error :("); } 

    Terminé para volver a clasificar según el tamaño el mapa de bits usando el código siguiente que parece haber resuelto el problema.

     BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap preview_bitmap = BitmapFactory.decodeFile(mPathName, options); 

    Creo que es – lo que dice que es. Su imagen es demasiado grande y ya que se carga en el flujo cuando la memoria se agota la excepción se lanza. Ni siquiera es la pregunta sobre cuánto memoria tienes en general, pero cuánto tiene disponible tu actividad particular.

    Utilice estas opciones en decodefile. Esperanza u puede mapa de bits elemenate supera vm presupuesto problema ..

     BitmapFactory.Options bfOptions=new BitmapFactory.Options(); bfOptions.inDither=false; //Disable Dithering mode bfOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared bfOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future bfOptions.inTempStorage=new byte[32 * 1024]; 

    ¿Ha revisado el DDMS? Con lo que he estado encontrando, probablemente no es el tamaño de las imágenes, porque Android parece manejar imágenes grandes bastante bien. Si rastrea el montón con DDMS puede encontrar que tiene una gran cantidad de memoria libre. Puedes "expandir" tu montón agregando esto

     static { @SuppressWarnings("unused") byte dummy[] = new byte[ 8*1024*1024 ]; } 

    A su código, para forzar el montón a expandirse. Puede hacer que sea un poco menos frecuente. Desafortunadamente, con la excepción afirma que no puede asignar una cierta cantidad de bytes. Digamos 1M. Si echa un vistazo a la línea "libre" verá que el bloque más grande es >> 1M. Hay algo extraño allí que no puedo entender. No se relaciona ni siquiera con la velocidad de las imágenes de barrido. Vi en algún hilo que se puede llamar "reciclar" o más para bitmaps. Todavía no veo por qué debería ayudar si el tamaño del montón está muy por encima del tamaño tomado.

    Tengo este error cuando empecé a cambiar el tamaño de una imagen de 320×240 a algo así como 64×240 (downscale), a continuación, la importación en mi proyecto (ya que quería mejorar la velocidad de procesamiento y que contenía un montón de regiones alfa inútil hasta este punto).

    Ahora la última respuesta tiene mucho sentido:

    Puede "expandir" su montón agregando esta static {@SuppressWarnings ("unused") byte dummy [] = new byte [8 * 1024 * 1024]; } A su código, para forzar el montón a expandirse. Puede hacer que sea un poco menos frecuente.

    Creo que esto es lo que me pasó. Android descifra automáticamente los drawables en mapas de bits, (y luego se almacenan en un montón, todo en tiempo de compilación?)

    Comencé a ver el error, cuando utilicé la versión más pequeña de mi imagen en tiempo de ejecución (yo los escalaba en runtime desde que programo un juego VGA con gráficos retro, usando BitmapFactory.decodeResource y Bitmap.createScaledBitmap).

    Debe ser como Marve dijo: The Heap no es lo suficientemente grande en mi caso después de encoger mi dibujable / imagen e importar en mi proyecto.

    Yo era capaz de deshacerse de mi OutOfMemoryException al cambiar el tamaño de la imagen de nuevo a un tamaño más grande (320×240), que verifica el problema supongo?

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