Speicherverlust in Android, wenn versucht wird, ein Formular mit Bild an den PHP-Server zu senden

8

Ich habe ein Speicherleck in dieser Datei, ich kann nicht genau wo finden, aber ich denke, ist das Bild um - & gt; (Bitmap bm = BitmapFactory.decodeFile(filename)) , Ich habe viele verschiedene Möglichkeiten ausprobiert, aber ich kann es nicht zum Laufen bringen.

%Vor%

Fehlerprotokoll

%Vor%     
jonaypelluz 22.09.2012, 22:27
quelle

5 Antworten

10

Bitmaps sind sehr große Speicherverbraucher. Zwei in den Speicher geladen zu haben, könnte das große Problem sein. Sie sollten BitmapFactory.Options in Erwägung ziehen, wenn Sie eine neue Bitmap dekodieren. Außerdem benötigen Sie bm2 nicht. Ersetzen Sie stattdessen diese Zeile durch Folgendes:

%Vor%

Wenn Sie keine weiteren Optionen haben, können Sie die Größe der Heap-Größe Ihrer Anwendung mithilfe des Anwendungsattributs android:largeHeap="true" in Ihrer AndroidManifest.xml erhöhen. Diese Option sollte nicht benötigt werden - und sollte nur für extrem grafikintensive Anwendungen in Betracht gezogen werden.

BEARBEITEN

Ein weiterer Link, den Sie für die Optimierung der Bitmap-Nutzung hilfreich finden können: Ссылка

    
Phil 13.11.2012, 15:51
quelle
4

Bitmaps verbrauchen viel Speicher ist klar. Sie müssen sich um Folgendes kümmern, um Bitmaps effektiv zu verwenden:

  • Denken Sie daran, dass Ihre PNGs in Zeichengrößen automatisch auf der Grundlage der Bildschirmgröße von Android angepasst werden. Und das braucht viel Speicher. Android passt die Größe von Bildern nicht an, wenn Bilder der benötigten Größe / Skalierung im richtigen Zeichenordner gefunden werden. Also mit dem Kopieren aller LDPI-Dateien auf HDPI zu beginnen. Dies reduziert die Speicherauslastung um mindestens 40%. Ich weiß, wie das klingt, aber das ist wahr, profiliere deine App mit debuggable = true im Manifest und nutze die Heap-Nutzung mit ddms. Nehmen Sie die Änderung vor und führen Sie genau das gleiche Szenario aus. Sie werden die Reduzierung um 40% bemerken.
  • Wenn Sie Ihre Bitmap lesen, verkleinern Sie sie. Verwenden Sie nicht nur CreateBitmap , da es die gesamte Datei liest und viel mehr Speicher benötigt. Stattdessen verwende BitmapOptions und verkleinere es. Um es zu verkleinern, müssen Sie zunächst Ihre Optionen festlegen und diese Optionen dann als Parameter für Ihren CreateBitmap -Aufruf verwenden. Hier ist ein schöner Link. Wenn Sie mehr über stackoverflow suchen, finden Sie weitere interessante Antworten.
  • Wenn Sie Dateien in Ihren Zeichenvorlagen mit der Größe 1024X512 haben, skalieren Sie sie. ODER Erstellen Sie neue Dateien, die übersichtlich, aber kleiner sind. Benutze diese Dateien für mdpi, lösche ldpi. Verwenden Sie den 1024X512 für Ihren hdpi-Ordner.
  • Erkunden Sie die Möglichkeit, kleinere Dateien zu verwenden, sortieren Sie sie nach Größe und spielen Sie ein wenig damit herum. Die grafische Ansicht von Eclipse für XML-Dateien ist wirklich ordentlich und relativ fehlerfrei. Benutze es.
  • Bearbeitet: Vergessen Sie nicht, Ihre Bitmap für die Garbage-Collection auf Null zu setzen. Das ist am wichtigsten.
Siddharth 19.11.2012 05:57
quelle
2

Einige allgemeine Hinweise:

  • Wie von @Phil vorgeschlagen, verbrauchen Bitmap Objekte in Android viel Speicher. Sie sollten immer SoftReferences verwenden, um Bitmaps zu halten, damit das Betriebssystem den Speicher bei Bedarf freigeben kann.
  • Sie sollten auch die recycle() -Methode verwenden, um Transformations-Bitmaps (dh Ihre bm2 -Variable) wegzuwerfen, wenn Sie damit fertig sind.
  • So paranoid es klingt, wenn Sie Bitmaps auf NULL setzen, wenn Sie damit fertig sind, empfiehlt es sich, auf den Garbage Collector hinzuweisen, dass sie gesammelt werden können. In der Regel führt das manuelle Aufrufen des gc in Android jedoch zu schlechteren oder keinen Auswirkungen.
  • Und schließlich profilieren Sie Ihre Bewerbung mit ddms !
Nik Reiman 14.11.2012 15:05
quelle
0

Kann ich nicht sicher sagen, da ich kein Java-Entwickler bin, aber in .NET BitMap calss IDisposable ist und empfohlen wird, wiederverwendet zu werden, sobald es nicht benutzt wird.
Vielleicht sollten Sie Ihren Speicher freigeben, nachdem BitMap geladen wurde?

    
VMAtm 16.11.2012 07:03
quelle
0

Ja Ein Speicher-Cache bietet einen schnellen Zugriff auf Bitmaps auf Kosten des wertvollen Anwendungsspeichers. Wenn LruCache das Problem nicht lösen kann, versuchen Sie Folgendes: < a href="http://blog.pseudoblue.com/2010/08/15/android-bitmaps-and-memory-leaks/"> ImageManager , in der Klasse ImageManager gibt es eine Methode recycleBitmaps.

    
Jamesprite 19.11.2012 10:16
quelle