2012-08-14 8 views
5

Ich weiß, dass vor API 10 von Android, war es wichtig, recycle() für Bitmap s, die nicht mehr verwendet werden, da die eigentlichen Rohdaten im nativen Speicher gespeichert ist.Wie funktioniert das Aufrufen von bitmap.recycle() in API 11+?

jedoch, wie API-11 sind Bitmap s in dem Heap gespeichert, so meine Frage ist:

ist es notwendig, noch recycle() auf Bitmap s zu nennen, wenn die API groß genug ist (mindestens 11)? Was macht es, wenn ich es auf einer solchen API anrufe?

+0

Wenn Sie sagen: "Es war wichtig, recycle() vor API 10 aufzurufen, bedeutet das, dass der Speicher niemals freigegeben wird, wenn Sie dies nicht tun? Die offiziellen Dokumente sagen, dass es "empfohlen" ist, aber wenn es die Bitmap im nativen Speicher zuweist, verstehe ich nicht, wie es ohne einen Aufruf von recycle() befreit werden kann. – Tiago

+0

@Tiago Sie können diesen Vortrag sehen: https://www.youtube.com/watch?v=_CruQY55HOk#t=656. Bitmaps benötigten wirklich wenig Platz im Heap, aber ihre Pixeldaten waren nicht (war doch ein Teil des OOM-Mechanismus des Heaps), so dass der GC nicht wusste, wie gut/schlecht die Situation ist und ob es nicht war. Wenn Sie während der Erstellung mehrerer Bitmaps ausgelöst werden, können Sie problemlos OOM abrufen. Deshalb ist es wichtig, "recycle" zu nennen, damit Bitmaps so schnell wie möglich gelöscht werden (weil der GC seine Arbeit nicht gut gemacht hat). –

+0

Ah, ich verstehe. Das erklärt einiges. Es ist ziemlich seltsam, dass die OutOfMemory-Ausnahme sowohl für den Heap als auch für den nativen Speicher zählt, während der GC nur auf den Heap schaut. Sobald aus Honeycomb + die Pixeldaten der Bitmaps ebenfalls im Heap sind, kann der GC seine Aufgabe richtig erfüllen. Was für ein Durcheinander, hehe! Danke fürs klarstellen! – Tiago

Antwort

5

Offizielle Dokumentation sagt, dass recycle() jetzt ein fortgeschrittener Anruf ist, also wenn Sie Ihre Bitmap freigeben möchten, können Sie einfach etwas wie bitmap = null schreiben und GC wird sich um alles andere kümmern.

+0

Aha . also recycle wird immer noch den speicher davon frei? –

+0

Ja, der Speicher wird den Speicher freigeben, ohne auf den GC zu schauen. Daher müssen Sie bei diesem Aufruf vorsichtig sein. – s0nicYouth