android - out-of-memory-Ausnahme beim erstellen von bitmap
Ich erhalte die folgende Fehlermeldung nach dem erstellen der bitmap zweiten mal:
04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
this._profileBitmap = Bitmap.createBitmap(_profileBitmap, xCoor, yCoor, width, height);
Log:
04-17 18:27:57.500: INFO/CameraCropView(3458): Original Photo Size: W 1536 x H 2048
04-17 18:28:06.170: INFO/CameraCropView(3458): xCoor: 291
04-17 18:28:06.170: INFO/CameraCropView(3458): yCoor: 430
04-17 18:28:06.170: INFO/CameraCropView(3458): Width: 952
04-17 18:28:06.170: INFO/CameraCropView(3458): Height: 952
Da das Bild riesig ist bekomme ich die Fehlermeldung. Aber die interessante Sache ist der Fehler nicht passieren, das erste mal, nur wenn ich das Bild das zweite mal, das macht mich glauben, dass dieser profileBitmap NICHT zerstört wird. Wie reinige ich das?
Du hast wahrscheinlich Recht, du bist nicht die Freigabe der Ressource. Sie müssen uns zeigen, einige Codes für uns, um in der Lage sein, um Ihnen zu helfen...
Lesen Sie dieses blog-post. codingaffairs.blogspot.com/2016/07/...
Lesen Sie dieses blog-post. codingaffairs.blogspot.com/2016/07/...
InformationsquelleAutor dropsOfJupiter | 2011-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem und beheben Sie es auf diese Weise:
Meine app ~18MB Gewicht, und wenn ich sehe, wie viel Speicher frei ich war schockiert - 654KB (1GB RAM!). Also habe ich einfach gelöscht, fast alle Bilder aus dem Projekt und heruntergeladen aus dem internet beim ersten start, und verwenden Sie Bilder von SD-Karte, wenn nötig.
Überprüfen, Gesamt - /freien Speicher für Ihre app verwenden:
EDIT: ich vergaß die Hauptsache - fügen Sie in Ihrem manifest, zwischen Aktivitäts-tags, diese Zeile:
android:largeHeap="true"
Erwähnenswert ist auch, dass die Erhöhung Ihrer heap-Größe wird auch steigern Sie Ihre garbage-collection-Zeiten, so dass Sie können erleben eine geringere Leistung bei einigen Geräten.
Mit großer Haufen ist nur eine Verschiebung des Problems, wenn möglich die bevorzugte Methode ist, zu re-denken, das Decodierung Verfahren löschen Sie nicht verwendete Ressourcen, etc.
InformationsquelleAutor Vitas
Gibt es viele Probleme mit dem Gedächtnis Ausnahmen mit bitmaps auf Android, viele von denen diskutiert werden auf stackoverflow. Wahrscheinlich wäre es am besten, wenn Sie ging durch die vorhandenen Fragen zu sehen, wenn Ihr mit einem der bereits bestehenden, wenn nicht, schreiben Sie, was macht Ihre situation anders.
Einige Beispiele:
Out of memory-Ausnahme aufgrund der großen bitmap-Größe
Android: out of memory-Ausnahme in der Galerie
Android-handling out-of-memory-Ausnahme Bildverarbeitung
etc:
https://stackoverflow.com/search?q=android+out+of+memory+Ausnahme+bitmap
InformationsquelleAutor ThomasW
android bitmap-Verarbeitung Tipps
Nun, hier sind Tipps, die Sie Folgen können, und vermeiden von out-of-memory-Ausnahme in Ihrem Android-Anwendung.
gleiche wie Aktivität).
2 . Wenn die Aktivität beendet ist. Überprüfen HEAP-DUMP (memory-Analyse-tool in Android studio).
Wenn es Objekte im HEAP-DUMP von der fertigen Tätigkeit ist die memory-leak. überprüfen Sie Ihre
code und identifizieren, was die Ursache Speicherverlust.
Nun, was ist inSampleSize ?
mit Hilfe von inSampleSize Sie wirklich sagen der decoder nicht zu greifen jeden pixel im Speicher, anstatt sub-Beispiel-Bild.
Dies wird dazu führen, dass weniger die Anzahl der Pixel in den Speicher geladen werden als das ursprüngliche Bild. man kann sagen, decoder greifen jeden 4. pixel oder jedes zweite pixel aus dem ursprünglichen Bild.
wenn inSampleSize ist 4. decoder wird wieder ein Bild, dass ist 1/16 der Anzahl der Pixel im Originalbild.
so, wie viel Speicher Sie gespeichert haben ? berechnen Sie 🙂
Lesen Bitmap-Größe vor dem laden in den Speicher.
Wie Lesen bitmap-Größe vor dem laden Bild in den Speicher, können Sie vermeiden die out-of -
Speicher Fehler??? Lasst uns Lernen,
verwenden inJustBounds = true
hier ist die Technik, mit der Hilfe, die Sie bekommen können Bild-dimension beore laden in den Arbeitsspeicher
Obigen code-snippet wird uns nicht Bild/bitmap. es wird null zurückgegeben, bei bitmap-Objekt.
aber es werden auf jeden Fall wiederkommen Breite und Höhe des Bildes. die R. id.meinbild.
Nun haben Sie die Breite und Höhe des Bildes. Sie können scale-up oder scale-down-Bild basiert auf folgenden Faktoren:
Bildschirm Größe und Dichte der Geräte.
Bitmap-Konfigurationen ist die Farbraum/Farbtiefe eines Bildes. Standard-bitmap-Konfiguration in Android ist RGB_8888 die 4 bytes pro pixel.
Wenn Sie RGB_565 Farbe-Kanal, verwenden 2 Byte pro pixel. die Hälfte der Speicherzuordnung für die gleiche Auflösung haben 🙂
Verwenden inBitmap-Eigenschaft für das recycling Zwecke.
Nicht machen, statisches Drawable-Objekt, da es keine garbage Collection ausgeführt werden.
Anfrage großen Haufen in der manifest-Datei.
Verwenden mehrere Prozesse, wenn Sie tun, viele Bild-Verarbeitung(Speicher-intensive task) oder verwenden NDK (Native Entwicklung mit c, c++)
okay, sicher, ich werde andere entfernen und erwähnen, eine Antwort als Referenz.
InformationsquelleAutor Hammad Tariq
Dies geschieht, weil Sie das laden der bitmap direkt,das verbraucht sehr viel Speicher.
Verwenden Sie stattdessen eine abgespeckte version des Bildes in _profileBitmap.
Dieser Kerl erklärt es ziemlich gut.
http://androidcocktail.blogspot.in/2012/05/solving-bitmap-size-exceeds-vm-budget.html
InformationsquelleAutor android
Könnte man eine Vektor-Drawable . Es verwendet eine xml-Datei zu beschreiben Ihr Bild , damit es verbraucht weniger Speicher.
Zu tun, dass Sie sollten das SVG-format für Ihre Bilder und erstellen Sie dann die xml-Datei mit einer dieser 2 Lösungen :
Schauen Sie sich diesen link für weitere Informationen:
https://developer.android.com/studio/write/vector-asset-studio.html
InformationsquelleAutor Marwen Doukh
Können Sie versuchen, den Aufruf von recycle() auf die bitmap, wenn Sie fertig sind. Dies wird klar, alle Bild-Daten und den freien Speicher. Wenn was versucht zu zeichnen, die bitmap nach dieser dann die app Abstürzen. Wenn Sie tun, bekommen einen crash-es kann Ihnen helfen, herauszufinden, was hält immer noch auf bitmap.
InformationsquelleAutor skorulis
Hatte ich dieses Problem, da war ich das ändern einer bitmap einmal, und dann zu modifizieren, dass die modifizierte version ein zweites mal, was in drei Versionen von der gleichen bitmap (original, plus die zwei modifizierten Versionen) werden im Speicher an der gleichen Zeit.
Ich es behoben, indem die änderung meiner Bild-Bearbeiten von code zu gelten beide Modifikationen die gleiche bitmap wie eine Art batch-Prozess, die Halbierung der Anzahl der geänderten Versionen meiner app halten musste, in Erinnerung.
InformationsquelleAutor Andrew Koster
Ich hatte das gleiche Problem, wenn das Telefon ausgeschaltet war und wieder eingeschaltet. Einfaches einstellen der bitmaps auf null und der aufrufende System.gc(); behoben alle Probleme.
InformationsquelleAutor a54studio
Mit Größeren Bildern kann es vermieden werden, indem die Probenahme in kleiner Größe.
Verwenden Sie die folgende Beispiel -
Referenz-
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
InformationsquelleAutor amir ansari