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

Ich bekomme java.lang.OutOfMemoryError , wann immer ich anrufen UploadActivity.java

Zeile Nummer 176 ist:

Bitmap bm = BitmapFactory.decodeFile(strPath); 

Mein log ansehen:

 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; } } 

  • Java.lang.OutOfMemoryError: Bitmap-Größe überschreitet VM-Budget - Android
  • Bitmap decodeStream OutOfMemory Ausnahme
  • Außerhalb des Speicherfehlers beim Setzen von großem JSON (InputStream) auf String
  • OOM bei der Verwendung von NetworkImageView (der Volley-Bibliothek)
  • Android App OOM (Out Of Memory) Anpassungsprioritäten für Prozesse
  • Fatal Signal 11 (SIGSEGV) bei 0x00000000 (Code = 1), Thread 27830 (ple.myfragexample) - nur auf Android 4.1.2
  • Out of Memory Error beim Laden von Bitmaps
  • Wie man diesen Fehler korrigiert: java.lang.OutOfMemoryError
  • 5 Solutions collect form web for “Java.lang.OutOfMemoryError – BitmapFactory.decode (strPath)”

    Sie müssen das Bitmap-Objekt recyceln.

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

    Nach oben Zeilen Code in deiner Get-Ansicht füge einfach den Code unten geschrieben /// jetzt recycle deine Bitmap das wird dein Gedächtnis bei jeder Iteration freigeben

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

    Danach auch wenn du den gleichen Fehler bekommst

    Ersetzen Sie unter Code

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

    mit

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

    Verwenden Sie inSampleSize, um Skalen-Bitmaps in den Speicher zu laden. Die Verwendung von Potenzen von 2 für inSampleSize-Werte ist für den Decoder schneller und effizienter. Allerdings, wenn Sie planen, die resized Versionen im Speicher oder auf der Festplatte zu cachen, ist es in der Regel immer noch wert Decodierung auf die am besten geeigneten Bild Dimensionen, um Platz zu sparen.

    Für mehr sehen Sie große Bitmaps effizient

    Vor dem Aufruf von Bitmap bm = BitmapFactory.decodeFile (strPath);

    Nennen Sie diese .. Bitmap bm = decodeSampledBitmapFromResource (strPath, reqWidth, reqHeight);

    Wenn du nochmal java.lang.OutOfMemoryError bekommst, dann lass es mich wissen

     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);; } 

    Verwenden Sie diese in Manifest-Datei in Application-Tag

     android:largeHeap="true" 

    Es ist ein Optimierungsproblem für Ihre Anwendung. Du bekommst OutOfMemoryError, denn wenn du BitmapFactory.decodeFile (StrPath) machst, versucht Android, Speicher für diese Bitmap zuzuordnen. In Ihrem Fall System kann nicht genug Platz frei zuzuteilen und das ist, warum Sie diesen Fehler bekommen.

    Jetzt, wie ich aus deinem Code sehen kann, versuchst du, eine Liste von Bildern mit ImageAdapter anzuzeigen. In diesem Fall muss Ihr Imageview eine kleinere Breite und Höhe haben als das tatsächliche Bild.

    Um dir eine verallgemeinerte Idee zu geben, ist hier was passiert:

    • ImageView Breite * Höhe = 100dp * 100dp
    • Bildbreite * Höhe = 800px * 800px.

    In diesem Szenario obwohl unsere imageview Breite-Höhe ist 100 * 100, aber wir versuchen, 800 * 800 Bild als Hintergrund zu setzen. Und das ist definitiv nicht ein effizienter Weg, weil das System Speicher für 800 * 800px Bild zuweisen wird, während 100 * 100 würde tun.

    Aus diesem Grunde, bevor du irgendeine Decodierung von Bitmap machst, solltest du die Bitmap abtasten, so dass nur 100 * 100 Speicher wert ist.

    Hier finden Sie eine ausführlichere Version dieser Erklärung

    Ich hatte das gleiche Problem. Ich habe alle oben genannten Vorschläge aufgenommen, aber ich hatte immer noch das Problem von java.lang.outOfMemoryError. Nach einer Menge von Tweaking herum, was schließlich arbeitete Skalierung Bildabmessungen (und Größe). Ursprünglich hatte ich Bilder von Dimensionen von 800 x 1000 Sorten. Ich habe sie auf etwa 60 x 80 skaliert (weil das ist was ich brauchte), und es hat funktioniert!

    Also, neben allen Ratschlägen, die Sie auf Stackoverflow und andere Seiten über dieses Problem erhalten, auch eine Basis Überprüfung Ihrer Bildgrößen und Dimensionen. Wird dir eine Menge Kopfschmerzen ersparen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.