it-swarm.com.de

Android: Java.lang.OutOfMemoryError: Fehler beim Zuweisen einer 23970828-Byte-Zuordnung mit 2097152 freien Bytes und 2 MB bis zum OOM

Ich möchte das Bitmap - Bild in ImageView von der bereits gespeicherten SD-Karte anzeigen. Nach dem Ausführen ist meine Anwendung abgestürzt und der OutOfMemoryError -Fehler wird angezeigt:

(Java.lang.OutOfMemoryError: Fehler beim Zuordnen einer 23970828-Byte-Zuordnung mit 2097152 freien Bytes und 2 MB bis zur OOM).

Ich habe keine Ahnung oder warum es aus dem Gedächtnis ist. Ich denke, dass meine Bildgröße sehr groß ist, also versuchte ich, sie zu ändern. 

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

Die Log-Cat-Informationen:

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)
259
androidTag

OutOfMemoryError ist das häufigste Problem, das in Android auftritt, insbesondere bei Bitmaps. Dieser Fehler wird von der Java Virtual Machine (JVM) ausgelöst, wenn ein Objekt aufgrund mangelnden Speicherplatzes nicht zugewiesen werden kann und der Garbage Collector keinen Speicherplatz freigeben kann. 

Wie von Aleksey erwähnt, können Sie in Ihrer Manifestdatei Android:hardwareAccelerated="false", Android:largeHeap="true" unten Entitäten hinzufügen. Dies funktioniert für einige Umgebungen.

<application
    Android:allowBackup="true"
    Android:hardwareAccelerated="false"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:largeHeap="true"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

sie sollten definitiv einige Androids Developer-Konzepte lesen, insbesondere hier: Bitmaps effizient anzeigen

Lesen Sie alle 5 Themen und schreiben Sie Ihren Code erneut. Wenn es immer noch nicht funktioniert, werden wir uns freuen zu sehen, was Sie mit dem Tutorial-Material falsch gemacht haben.

Hier einige mögliche Antworten auf diese Art von Fehlern in SOF

Android: BitmapFactory.decodeStream () ist mit einer 400-KB-Datei mit 2 MB freiem Heap nicht genügend Arbeitsspeicher

So lösen Sie Java.lang.OutOfMemoryError-Probleme in Android

Android: Java.lang.OutOfMemoryError

Java.lang.OutOfMemoryError

Lösung für OutOfMemoryError: Die Bitmap-Größe überschreitet das Budget von VM

Bearbeiten: Aus den Kommentaren von @cjnash

Wenn Sie nach dem Hinzufügen dieser Zeile immer noch Abstürze hatten, versuchen Sie, Ihr Bild in Ihren res/drawable-xhdpi/-Ordner anstatt in res/drawable/zu kopieren, wodurch das Problem möglicherweise behoben wird.

397
King of Masses

haben Sie versucht, dies unter Anwendungen zu Ihrem Manifest hinzuzufügen? Android:largeHeap="true"?

so was

  <application
      Android:name=".ParaseApplication"
      Android:allowBackup="true"
      Android:icon="@mipmap/ic_launcher"
      Android:label="@string/app_name"
      Android:theme="@style/AppTheme"
      Android:largeHeap="true" >
75
TSG

Tatsächlich können Sie diese Zeilen Android:hardwareAccelerated="false", Android:largeHeap="true" in einigen Fällen in Ihr Manifest einfügen. Beachten Sie jedoch, dass der andere Teil des Codes damit argumentieren kann.

<application
    Android:allowBackup="true"
    Android:hardwareAccelerated="false"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:largeHeap="true"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">
25

Für mich bestand das Problem darin, dass meine PNG-Datei dekomprimiert wurde, um eine wirklich große Bitmap im Speicher zu sein, da das Bild sehr große Abmessungen hatte (obwohl die Dateigröße klein war).

Das Problem bestand also darin, das Bild einfach zu verkleinern :)

19

Das sollte funktionieren

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapInsurance = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
16
Akshay komarla

Verwenden Sie Glide Library und überschreiben Sie die Größe mit einer geringeren Größe.

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

Größe ändern Ihr Bild vor dem Einrichten von ImageView folgendermaßen:

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

wobei size die tatsächliche Größe von ImageView ist. Sie können die Größe erreichen, indem Sie Folgendes messen:

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

und verwenden Sie die nächste Größe imageView.getMeasuredWidth() und imageView.getMeasuredHeight() für scaling.

8

Ich habe dieses Problem gelöst, indem ich die Größe des Bildes verkleinerte. Ich verwende Xamarin-Form. Durch die Verringerung der Größe des PNG-Bildes wurde das Problem behoben.

4
maxspan

Ich habe unter Fehler bekommen 

"E/art: OutOfMemoryError werfen" Fehler beim Zuweisen eines 47251468-Byte Zuweisung mit 16777120 freien Bytes und 23 MB bis OOM "

nach dem Hinzufügen von Android:largeHeap="true" in AndroidManifest.xml dann habe ich alle Fehler beseitigt

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/guruji"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:largeHeap="true"
    Android:theme="@style/AppTheme">
3
saigopi

Problem: Zuweisung einer 37748748-Byte-Zuordnung mit 16777120 .__ ist fehlgeschlagen. freie Bytes und 17 MB bis OOM

Lösung: 1.Öffnen Sie Ihre Manifestdatei 2. innerhalb des Anwendungs-Tags fügen Sie einfach zwei Zeilen hinzu

 Android:hardwareAccelerated="false"
 Android:largeHeap="true"

Beispiel: 

 <application
        Android:allowBackup="true"
        Android:hardwareAccelerated="false"
        Android:largeHeap="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:roundIcon="@mipmap/ic_launcher_round"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme">
3
Kishore Reddy

Soluton probiere dies in deiner Manifest-Datei und benutze Glide Library  

kompiliere "com.github.bumptech.glide: glide: 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 = "false"

Android: largeHeap = "true"

<application
    Android:allowBackup="true"
    Android:hardwareAccelerated="false"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:largeHeap="true"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

Verwenden Sie diese Bibliothek

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

Seine Arbeit glücklich Codierung 

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();
    }
}
3
Keshav Gera

Ich hatte auch das Problem.

Dasselbe gilt für die meisten anderen über ... Das Problem wird durch ein großes Bild verursacht.

Ändern Sie einfach die Größe einiger Bilder, Sie müssen keinen Code ändern.

2
Mike Yan

Ich bin ein Neuling in der Entwicklung von Android, aber ich hoffe, dass meine Lösung hilft, es funktioniert perfekt für meinen Zustand. Ich benutze Imageview und setze den Hintergrund auf "src", weil ich versuche, eine Frame-Animation zu erstellen. Ich habe den gleichen Fehler erhalten, aber als ich versuchte, das zu kodieren, funktionierte es

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();
1
DianeFlores
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

50/100 Wenn man 100 verwendet, kann die ursprüngliche Auflösung die Apps für nicht genügend Speicher stoppen.

bei einer Auflösung von 50 oder weniger als 100 ist dies eine Auflösung von 50% oder weniger als 100

1
RAHINUR RAHMAN

Mein Problem wurde nach dem Hinzufügen behoben

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

in der Build.Gradle-Datei

1
Midhilaj

Das hat für mich funktioniert: einfach Bilder von drawable nach drawable-hdpi verschieben.

1
Hossein Amini

Ich bin auf dieses Problem gestoßen, als ich meine alte Aktivität nicht abgebrochen habe, als ich zu einer neuen Aktivität überging. Ich habe es mit finish(); behoben

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

Sie müssen die Größe des Objekts in Drawable ändern. Es ist zu groß, um Android anzuzeigen. z.B. Wenn Sie ein Bild einstellen, versuchen Sie ein Bild mit weniger Pixeln. Es funktioniert für mich ... Danke. :)

1

In einigen Fällen (z. B. Operationen in einer Schleife) ist Garbage Collector langsamer als Ihr Code. Sie können eine helper-Methode aus dieser Antwort verwenden bis wait for Garbage Collector.

1
Zon

Ihre App stürzt ab, weil Ihre Bildgröße (in MB oder KB) zu groß ist , so dass der Speicherplatz nicht zugewiesen wird. Bevor Sie Ihr Bild in ein Zeichen einfügen, müssen Sie nur die Größe reduzieren.

ODER 

Sie können Folgendes in application tag unter Manifest.xml hinzufügen 

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

Nach dem Hinzufügen dieser App stürzt nicht ab.

  • verwenden Sie immer weniger Größenbilder in App.
  • Wenn Sie große Bilder in der App hinzufügen, sollten Sie obige Syntex hinzufügen, die App-Größe nimmt jedoch zu.
1
rhaldar

Ich habe herausgefunden, dass Bilder im "Drawable" -Ordner auf hochauflösenden Telefonen in ein viel größeres Bild umgewandelt werden. Zum Beispiel wird ein 200k-Bild mit einer höheren Auflösung wie 800k oder 32000k erneut abgetastet. Ich musste dies selbst herausfinden und habe bis jetzt keine Dokumentation für diese Heapspeicherfalle gesehen. Um dies zu verhindern, lege ich alles in einen drawable-nodpi-Ordner (zusätzlich zur Verwendung von 'options' in BitmapFactory basierend auf dem jeweiligen Geräteheap). Ich kann es mir nicht leisten, die Größe meiner App mit mehreren gezeichneten Ordnern aufzublähen, zumal der Bereich der Bildschirm-Defs jetzt so groß ist. Das Schwierige ist, dass Studio jetzt den Ordner 'drawable-nodpi' in der Projektansicht nicht speziell angibt, sondern nur einen 'drawable'-Ordner. Wenn Sie nicht aufpassen, wenn Sie ein Bild in diesem Ordner in Studio ablegen, wird es nicht wirklich in das Drawable-Nodpi fallen:

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

Klicken Sie im Dialogfeld auf den Ordner nodpi, da in der Projektansicht nicht alle gezeichneten Ordner wie zuvor einzeln angezeigt werden. Es ist also nicht sofort ersichtlich, dass ein falscher Ordner erstellt wurde. Das Studio hat die Vanilla 'drawable' irgendwann für mich neu erstellt, nachdem ich sie längst gelöscht hatte:

 enter image description here

1
Androidcoder

fügen Sie dies zu Ihrem Manifest unter Anwendungen hinzu? Android: largeHeap = "true"

1
SAURABH OMER

Verwenden Sie eine Bildladebibliothek wie Picasso oder Glide . Die Verwendung dieser Bibliotheken verhindert in Zukunft Abstürze.

0
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;

float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();

Fügen Sie dann im Application-Tag largeheap size = "true" hinzu

0

Wenn Sie ein Bild hochladen, reduzieren Sie die Bildqualität, den zweiten Parameter der Bitmap. Dies war die Lösung in meinem Fall. Früher waren es 90, dann habe ich es mit 60 versucht (so wie es jetzt im Code steht).

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

Ich nehme an, Sie möchten dieses Bild als Symbol verwenden. Wie Android Ihnen mitteilt, ist Ihr Bild zu groß. Sie müssen lediglich Ihr Bild skalieren, damit Android weiß, welche Größe des Bildes verwendet werden soll und wann dies der Bildschirmauflösung entspricht. Gehen Sie dazu in Android Studio folgendermaßen vor: 1. Klicken Sie mit der rechten Maustaste auf den Ordner res. 2. Wählen Sie Image Asset. 3. Wählen Sie den Symboltyp. 4. Geben Sie dem Symbol einen Namen. 5. Wählen Sie Image on Asset Type. 6. Schneiden Sie das Bild . Beziehen Sie sich in Ihrer XML-Datei oder Ihrem Quellcode auf das Bild, das sich je nach ausgewähltem Asset-Typ entweder im Layout- oder im Mipmap-Ordner befindet. Der Fehler wird verschwinden.

Versuchen Sie es mit dem einfachsten. Möglicherweise stürzt Ihre App ab, weil Ihre Bildgröße (in MB) zu groß ist und der Speicherplatz hierfür nicht zugewiesen wird. Bevor Sie also Ihr Bild in Drawable einfügen, reduzieren Sie die Größe mit jeder Viewer-Software. Wenn Sie zur Laufzeit ein Bild aus der Galerie erstellen, komprimieren Sie Ihre Bitmap vor dem Speichern. definitiv für dich wird es sein.

0
neens
Last but not the least....

Try Method One:

Simple Add these lines of code in the gradle file

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }

Example:

Android {
    compileSdkVersion XX
    buildToolsVersion "28.X.X"

    defaultConfig {
        applicationId "com.example.xxxxx"
        minSdkVersion 14
        targetSdkVersion 19
    }

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }
}

*******************************************************************

Method Two:

Add these two lines of code in manifest file...

Android:hardwareAccelerated="false" 
Android:largeHeap="true"

Example:

<application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:hardwareAccelerated="false"
        Android:largeHeap="true"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

It will Work for sure any of these cases.....