Ich möchte das Bitmap- Bild in ImageView von einer SD- Karte anzeigen , die bereits gespeichert ist. Nach dem Ausführen stürzt meine Anwendung ab und es wird der OutOfMemoryError- Fehler angezeigt :
(java.lang.OutOfMemoryError: Fehler beim Zuweisen einer 23970828-Byte-Zuordnung mit 2097152 freien Bytes und 2 MB bis OOM)
Ich habe keine Ahnung oder warum es nicht mehr im Gedächtnis ist. Ich denke, meine Bildgröße ist sehr groß, deshalb habe ich versucht, 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)
android
android-bitmap
androidTag
quelle
quelle
Antworten:
OutOfMemoryError ist das häufigste Problem bei Android, insbesondere beim Umgang mit Bitmaps. Dieser Fehler wird von der Java Virtual Machine (JVM) ausgelöst, wenn ein Objekt aufgrund fehlenden Speicherplatzes nicht zugewiesen werden kann und der Garbage Collector keinen Speicherplatz freigeben kann.
Wie von Aleksey erwähnt, können Sie unter Entitäten in Ihrer Manifest - Datei hinzufügen
android:hardwareAccelerated="false"
,android:largeHeap="true"
wird es für einige Umgebung arbeiten.Sie sollten auf jeden Fall einige der Androids Developer-Konzepte lesen, insbesondere hier: Effizientes Anzeigen von Bitmaps
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 für diese Art von Fehlern in SOF
Android: BitmapFactory.decodeStream () nicht genügend Speicher mit einer 400-KB-Datei mit 2 MB freiem Heap
So lösen Sie Probleme mit java.lang.OutOfMemoryError in Android
Android: java.lang.OutOfMemoryError
java.lang.OutOfMemoryError
Lösung für OutOfMemoryError: Die Bitmap-Größe überschreitet das VM-Budget
Bearbeiten: Aus den Kommentaren von @cjnash
Versuchen Sie für alle, die nach dem Hinzufügen dieser Zeile noch Abstürze hatten, Ihr Bild in Ihren Ordner res / drawable-xhdpi / anstatt in Ihren Ordner res / drawable / zu stecken, um das Problem zu beheben.
quelle
Haben Sie versucht, dies Ihrem Manifest unter Anwendungen hinzuzufügen?
android:largeHeap="true"
?so was
quelle
Für mich war das Problem, 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 winzig war).
Die Lösung bestand also darin, die Größe des Bildes einfach zu ändern :)
quelle
android:hardwareAccelerated="false"
funktionierten einige Animationen wie Layoutschatten nicht. Aber nach der Größenänderung wurden alle Probleme gelöst, danke! +1 für diesen Hinweis!Eigentlich können Sie in Ihrem Manifest diese Zeilen hinzufügen
android:hardwareAccelerated="false"
,android:largeHeap="true"
es funktioniert in einigen Situationen, aber beachten Sie, dass der andere Teil des Codes damit streiten kann.quelle
Das sollte funktionieren
quelle
Ändern Sie die Größe Ihres Bildes vor dem Einrichten in ImageView wie folgt:
Dabei ist Größe die tatsächliche Größe von ImageView. Sie können die Größe erreichen, indem Sie messen:
und verwenden Sie die nächste Größe
imageView.getMeasuredWidth()
undimageView.getMeasuredHeight()
fürscaling
.quelle
Verwenden Sie die Gleitbibliothek und überschreiben Sie die Größe, um die Größe zu verringern.
quelle
Ich habe unten Fehler
Nach dem Hinzufügen
android:largeHeap="true"
in AndroidManifest.xml entferne ich alle Fehlerquelle
Ich habe dieses Problem behoben, indem ich die Größe des Bildes auf eine geringere Größe geändert habe. Ich benutze Xamarin Form. Durch Verringern der Größe des PNG-Bildes wurde das Problem behoben.
quelle
Lösung: 1. Öffnen Sie Ihre Manifestdatei. 2. Fügen Sie innerhalb des Anwendungs-Tags nur zwei Zeilen hinzu
Beispiel:
quelle
Ich habe festgestellt, dass Bilder im Ordner "Zeichenbar" auf HD-Telefonen in ein viel größeres Bild konvertiert werden. Beispielsweise wird ein 200k-Bild auf eine höhere Auflösung wie 800k oder 32000k neu abgetastet. Ich musste dies selbst herausfinden und habe bisher keine Dokumentation für diese Heap-Speicherfalle gesehen. Um dies zu verhindern, habe ich alles in einen Drawable-Nodpi-Ordner gelegt (zusätzlich zur Verwendung von 'Optionen' in BitmapFactory basierend auf dem jeweiligen Geräte-Heap). Ich kann es mir nicht leisten, die Größe meiner App mit mehreren Zeichenordnern aufzublähen, zumal die Auswahl an Bildschirmdefiziten jetzt so groß ist. Das Knifflige ist, dass Studio jetzt nicht speziell den Ordner 'drawable-nodpi' als solchen in der Projektansicht anzeigt, sondern nur einen Ordner 'drawable'. Wenn Sie nicht aufpassen, wenn Sie ein Bild in diesem Ordner im Studio ablegen, hat es gewonnen. '
Stellen Sie sicher, dass Sie im Dialogfeld auf den Nodpi-Ordner klicken, da in der Projektansicht nicht wie früher alle Zeichenordner separat angezeigt werden, sodass nicht sofort ersichtlich ist, dass der Ordner falsch ist. Studio hat die Vanille irgendwann für mich neu erstellt, nachdem ich sie vor langer Zeit gelöscht hatte:
quelle
Das hat bei mir funktioniert: Verschieben Sie einfach Bilder aus dem Zeichenordner nach drawable-hdpi.
quelle
Soluton versuchen Sie dies in Ihrer Manifest-Datei und verwenden Sie die Glide-Bibliothek
kompiliere 'com.github.bumptech.glide: glide: 3.7.0'
android: hardwareAccelerated = "false"
android: largeHeap = "wahr"
Verwenden Sie diese Bibliothek
Es funktioniert Happy Coding
quelle
Fügen Sie dies Ihrem Manifest unter Anwendungen hinzu? android: largeHeap = "wahr"
quelle
Ich hatte auch das Problem.
Gleiches gilt für die meisten anderen oben. Das Problem wird durch ein großes Bild verursacht.
Ändern Sie einfach die Größe einiger Bilder und Sie müssen keinen Code ändern.
quelle
In einigen Fällen (z. B. Operationen in einer Schleife) ist der Garbage Collector langsamer als Ihr Code. Sie können eine Hilfsmethode aus dieser Antwort verwenden , um auf den Garbage Collector zu warten .
quelle
Ich bin ein Neuling in der Android-Entwicklung, aber ich hoffe, meine Lösung hilft, es funktioniert perfekt unter meinem Zustand. Ich benutze Imageview und setze den Hintergrund auf "src", weil ich versuche, eine Rahmenanimation zu erstellen. Ich habe den gleichen Fehler erhalten, aber als ich versuchte, dies zu codieren, funktionierte es
quelle
Ich bin auf dieses Problem gestoßen, als ich meine alte Aktivität nicht beendet habe, als ich zu einer neuen Aktivität übergegangen bin. Ich habe es mit behoben
finish();
quelle
50/100 Wenn man 100 verwendet, kann die ursprüngliche Auflösung die Apps für nicht genügend Speicher stoppen.
Wenn 50 oder weniger als 100, entspricht dies einer Auflösung von 50% oder weniger als 100, um ein Problem mit zu wenig Speicher zu vermeiden
quelle
Sie müssen die Größe des Objekts in Drawable ändern. Es ist zu groß für Android, um es anzuzeigen. Beispiel: Wenn Sie ein Bild einstellen, versuchen Sie es mit einem Bild mit weniger Pixeln. Für mich geht das. Vielen Dank. :) :)
quelle
Ihre App stürzt ab, weil Ihre Bildgröße (in MB oder KB) zu groß ist, sodass kein Speicherplatz dafür zugewiesen wird. Reduzieren Sie also die Größe, bevor Sie Ihr Bild in Drawable einfügen.
ODER
Sie können Folgendes im Anwendungstag unter Manifest.xml hinzufügen
Nach dem Hinzufügen dieser App stürzt nicht ab.
quelle
Mein Problem wurde nach dem Hinzufügen gelöst
in der Build.Gradle-Datei
quelle
quelle
Versuchen Sie beim Hochladen eines Bildes, die Bildqualität zu verringern. Dies ist der zweite Parameter der Bitmap. Dies war die Lösung in meinem Fall. Früher war es 90, dann habe ich es mit 60 versucht (wie es jetzt im Code unten steht).
quelle
Versuchen Sie es mit dem einfachsten. Möglicherweise stürzt Ihre App ab, weil Ihre Bildgröße (in MB) zu groß ist, sodass kein Speicherplatz dafür zugewiesen wird. Bevor Sie Ihr Bild in Drawable einfügen, reduzieren Sie die Größe mit einer beliebigen Viewer-Software oder wenn Sie zur Laufzeit Bilder aus der Galerie aufnehmen, komprimieren Sie Ihre Bitmap vor dem Speichern. Es hat bei mir funktioniert. auf jeden Fall für dich sein.
quelle
Fügen Sie dann im Appliaction-Tag largeheapsize = "true" hinzu
quelle
Ich nehme an, Sie möchten dieses Bild als Symbol verwenden. Wie Android Ihnen sagt, ist Ihr Bild zu groß. Sie müssen lediglich Ihr Bild skalieren, damit Android weiß, welche Größe des Bildes wann verwendet werden soll, je nach Bildschirmauflösung. Um dies zu erreichen, gehen Sie in Android Studio wie folgt vor: 1. Klicken Sie mit der rechten Maustaste auf den Ordner res, 2. wählen Sie Image Asset aus. 3. Wählen Sie den Symboltyp aus. 4. Geben Sie dem Symbol einen Namen. 5. Wählen Sie Image on Asset Type aus. 6. Schneiden Sie Ihr Bild. Klicken Sie auf Weiter und beenden Sie den Vorgang . Beziehen Sie sich in Ihrem XML- oder Quellcode einfach auf das Bild, das sich je nach ausgewähltem Asset-Typ entweder im Layout- oder im Mipmap-Ordner befindet. Der Fehler wird behoben.
quelle
Ich empfehle nicht wirklich, das Manifest so zu bearbeiten
Diese Optionen verursachen keinen reibungslosen Animationseffekt in Ihrer App. Außerdem wird 'liveData' oder das Ändern Ihrer lokalen Datenbank (Sqlite, Room) langsam aktiviert. Es ist schlecht für die Benutzererfahrung.
Daher empfehle ich RESIZE Bitmap
Unten ist der Beispielcode
quelle
Wenn android: largeHeap = "true" dann bei Ihnen nicht funktioniert hat
1:
2:
Android nicht entfernen: largeHeap = "true"!
quelle
Verwenden Sie eine Bildladebibliothek wie Picasso oder Glide . Die Verwendung dieser Bibliotheken verhindert in Zukunft Abstürze.
quelle