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


Java.lang.OutOfMemoryError – BitmapFactory.decode (strPath)

Estoy recibiendo java.lang.OutOfMemoryError , siempre que esté llamando a UploadActivity.java

La línea número 176 es:

  • ¿Qué está desencadenando esta instancia de excepción: "java.lang.IllegalArgumentException: El observador es nulo." Y cómo podría evitarse?
  • Obtén todos los mensajes de WhatsApp
  • No se pudo resolver resource @ style / Widget.Holo.Light.ActionMode.Inverse
  • Android: LocationManager vs Servicios de Google Play
  • Libros sobre Android Diseño de interfaces de usuario
  • Barra de herramientas Android demasiado alta en modo horizontal
  • Bitmap bm = BitmapFactory.decodeFile(strPath); 

    Ver mi registro:

     12-07 17:57:10.585: E/AndroidRuntime(16708): FATAL EXCEPTION: main 12-07 17:57:10.585: E/AndroidRuntime(16708): java.lang.OutOfMemoryError 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:449) 12-07 17:57:10.585: E/AndroidRuntime(16708): at com.example.camera.UploadActivity$ImageAdapter.getView(UploadActivity.java:176) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.AbsListView.obtainView(AbsListView.java:2465) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.ListView.makeAndAddView(ListView.java:1775) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.ListView.fillDown(ListView.java:678) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.ListView.fillFromTop(ListView.java:739) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.ListView.layoutChildren(ListView.java:1628) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.AbsListView.onLayout(AbsListView.java:2300) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.View.layout(View.java:14063) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewGroup.layout(ViewGroup.java:4607) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.View.layout(View.java:14063) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewGroup.layout(ViewGroup.java:4607) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.View.layout(View.java:14063) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewGroup.layout(ViewGroup.java:4607) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.View.layout(View.java:14063) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewGroup.layout(ViewGroup.java:4607) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.View.layout(View.java:14063) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewGroup.layout(ViewGroup.java:4607) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1996) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1817) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1114) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4520) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.Choreographer.doFrame(Choreographer.java:525) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.os.Handler.handleCallback(Handler.java:615) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.os.Handler.dispatchMessage(Handler.java:92) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.os.Looper.loop(Looper.java:137) 12-07 17:57:10.585: E/AndroidRuntime(16708): at android.app.ActivityThread.main(ActivityThread.java:4921) 12-07 17:57:10.585: E/AndroidRuntime(16708): at java.lang.reflect.Method.invokeNative(Native Method) 12-07 17:57:10.585: E/AndroidRuntime(16708): at java.lang.reflect.Method.invoke(Method.java:511) 12-07 17:57:10.585: E/AndroidRuntime(16708): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1036) 12-07 17:57:10.585: E/AndroidRuntime(16708): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:803) 12-07 17:57:10.585: E/AndroidRuntime(16708): at dalvik.system.NativeStart.main(Native Method) 

    UploadActivity.java:-

     public class ImageAdapter extends BaseAdapter { private Context context; public ImageAdapter(Context c) { // TODO Auto-generated method stub context = c; } public int getCount() { // TODO Auto-generated method stub return ImageList.size(); } public Object getItem(int position) { // TODO Auto-generated method stub return position; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = inflater.inflate(R.layout.list_upload, null); } // ColImgName TextView txtName = (TextView) convertView.findViewById(R.id.ColImgName); strPath = ImageList.get(position).toString(); // Get File Name fileName = strPath.substring( strPath.lastIndexOf('/')+1, strPath.length() ); File file = new File(strPath); @SuppressWarnings("unused") long length = file.length(); txtName.setText(fileName); // Image Resource ImageView imageView = (ImageView) convertView.findViewById(R.id.ColImgPath); Bitmap bm = BitmapFactory.decodeFile(strPath); imageView.setImageBitmap(bm); // ColStatus final ImageView txtStatus = (ImageView) convertView.findViewById(R.id.ColStatus); txtStatus.setImageResource(R.drawable.bullet_button); // progressBar final ProgressBar progress = (ProgressBar) convertView.findViewById(R.id.progressBar); progress.setVisibility(View.GONE); //btnUpload final ImageButton btnUpload = (ImageButton) convertView.findViewById(R.id.btnUpload); btnUpload.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Upload btnUpload.setEnabled(false); startUpload(position); } }); return convertView; } } 

  • Android: Establecer márgenes en un FrameLayout mediante programación, no funciona
  • Android Studio: Añadir jar como biblioteca?
  • ¿Dónde está debug.keystore en Mac?
  • Reciclador vista de la lista de desplazamiento vertical con fila horizontal desplazable
  • ¿Cuándo puedo primero medir una vista?
  • ¿Cómo implementar el botón en ViewPager?
  • 5 Solutions collect form web for “Java.lang.OutOfMemoryError – BitmapFactory.decode (strPath)”

    Necesita reciclar el objeto Bitmap.

      Bitmap bm = BitmapFactory.decodeFile(strPath); imageView.setImageBitmap(bm); 

    Después de las líneas de código de arriba en su vista obtener sólo tiene que añadir el código escrito a continuación /// ahora reciclar su mapa de bits esto liberará su memoria en cada iteración

      if(bm!=null) { bm.recycle(); bm=null; } 

    Después de esto también si usted está recibiendo el mismo error el

    Reemplazar debajo del código

      Bitmap bm = BitmapFactory.decodeFile(strPath); imageView.setImageBitmap(bm); 

    con

      final BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap bm = BitmapFactory.decodeFile(strPath,options); imageView.setImageBitmap(bm); 

    Use inSampleSize para cargar escalas bitmaps a memoria. El uso de potencias de 2 para los valores de inSampleSize es más rápido y más eficiente para el decodificador. Sin embargo, si planea almacenar en caché las versiones redimensionadas en la memoria o en el disco, normalmente vale la pena decodificar las dimensiones de imagen más apropiadas para ahorrar espacio.

    Para obtener más información, consulte Carga de mapas de bits grandes de forma eficiente.

    Antes de llamar Bitmap bm = BitmapFactory.decodeFile (strPath);

    Llamar a esto .. Bitmap bm = decodeSampledBitmapFromResource (strPath, reqWidth, reqHeight);

    Si usted consigue otra vez java.lang.OutOfMemoryError entonces déjeme saber

     public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and // keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } public static Bitmap decodeSampledBitmapFromResource(String strPath,int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(strPath, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options,reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(strPath, options);; } 

    Use esto en el archivo de manifiesto en la etiqueta de la aplicación

     android:largeHeap="true" 

    Es un problema de optimización para su aplicación. Usted está recibiendo OutOfMemoryError porque cuando usted está haciendo BitmapFactory.decodeFile (strPath) android está tratando de asignar memoria para ese mapa de bits. En su caso el sistema no puede encontrar suficiente espacio libre para asignar y es por eso que está recibiendo este error.

    Ahora como puedo ver desde su código que está tratando de mostrar la lista de imágenes con ImageAdapter. En ese caso su imagen debe tener una anchura y una altura más pequeñas que la imagen real.

    Para darle una idea más generalizada aquí está lo que está sucediendo:

    • ImageView width * height = 100dp * 100dp
    • Ancho de la imagen * height = 800px * 800px.

    En este escenario, aunque nuestra anchura-altura de la vista de la imagen es 100 * 100 pero estamos intentando fijar la imagen 800 * 800 como fondo. Y esto definitivamente no es una manera eficiente porque el sistema asignará memoria para la imagen 800 * 800px mientras que 100 * 100 haría.

    Es por eso que antes de hacer cualquier decodificación de mapa de bits debe probar el mapa de bits de modo que sólo 100 * 100 de memoria se asigna.

    Encontrará una versión más detallada de esta explicación aquí

    Yo tuve el mismo problema. He incorporado todas las sugerencias anteriores, pero todavía tenía el problema de java.lang.outOfMemoryError. Después de un montón de ajustes, lo que finalmente funcionó fue reducir las dimensiones de la imagen (y el tamaño). Originalmente, tenía imágenes de dimensiones 800 x 1000 clases. Los reajusté a cerca de 60 x 80 (porque eso es lo que necesitaba), y funcionó!

    Así que, además de seguir todos los consejos que obtenga en stackoverflow y otros sitios acerca de este problema, también realice una comprobación de base de sus tamaños y dimensiones de imagen. Le ahorrará mucho dolor de cabeza.

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