H
HighBaer
Neues Mitglied
- 0
Hallo Leute!
Ich weiß nicht mehr weiter, vielleicht habt Ihr ja noch eine Idee.
Ich entwickle eine App, die zu bestimmten Objekten Fotos anzeigt. Diese Fotos befinden sich als JPEG bereits auf dem Smartphone. Es wird immer nur ein Foto geladen und in einem eigenen View angezeigt. Da die App grundsätzlich hochkannt läuft die Fotos aber im Querformat ("Landscape") angezeigt werden, wird die Ausgabe entsprechend per App gedreht.
Wenn ich das Foto nicht mehr benötige, also wenn der betreffenden View verlassen wird, wird für das entsprechende Bitmap recycle() aufgerufen:
Nur wird der Speicher trotz recycle() nicht freigegeben. So kommt es dann nach einer Weile zum OutOfMemory-Fehler.
Wenn man sich FBmpFoto im Debuger ansieht, so gibt es eine Eigenschaft "mBuffer" in der wohl das eigentliche Bitmap abgespeichert ist und in dem Fall so um die 6 MB groß ist. Auch nach dem Aufruf von "recycle()".
Wenn ich aber FBmpFoto nicht mit drawBitmap() ausgeben, in dem ich die Prorgammzeile auskommentiere, funktioniert recycle() wie es soll, die Eigenschaft mBuffer zeigt dann auf "null" und gc() gibt die 6 MB frei. Es sieht so aus, als würde es durch das drawBitmap() noch irgend einen Verweis auf FBmpFoto geben, der verhindert, dass recycle() den Buffer leer.
Wenn man mal in den Source (V23) bei recycle() nach sieht:
Nach dem Kommentar scheint es so, dass das Bitmap noch auf einem "native level" verwendet wird. Es wird auch nicht später freigegeben.
Hat jemand eine Idee, warum drawBitmap() einen aktiven Verweis auf das native Bitmap hinterlässt uind wie man es verhindern oder aufheben kann?
Kann man noch irgenwie anderes das Bitmap freigeben?
Gibt es irgendeine Möglichkeit das Canvas-Objekt (was vermutlich der Übeltäter ist) zu zerstören oder zumindest zu veranlassen, den Verweis auf das Bitmap zu löschen?
Ich weiß nicht mehr weiter, vielleicht habt Ihr ja noch eine Idee.
Ich entwickle eine App, die zu bestimmten Objekten Fotos anzeigt. Diese Fotos befinden sich als JPEG bereits auf dem Smartphone. Es wird immer nur ein Foto geladen und in einem eigenen View angezeigt. Da die App grundsätzlich hochkannt läuft die Fotos aber im Querformat ("Landscape") angezeigt werden, wird die Ausgabe entsprechend per App gedreht.
Wenn ich das Foto nicht mehr benötige, also wenn der betreffenden View verlassen wird, wird für das entsprechende Bitmap recycle() aufgerufen:
Code:
if (FBmpFoto != null) {
FBmpFoto.recycle();
FBmpFoto = null;
Runtime.getRuntime().gc();
} // if
Nur wird der Speicher trotz recycle() nicht freigegeben. So kommt es dann nach einer Weile zum OutOfMemory-Fehler.
Wenn man sich FBmpFoto im Debuger ansieht, so gibt es eine Eigenschaft "mBuffer" in der wohl das eigentliche Bitmap abgespeichert ist und in dem Fall so um die 6 MB groß ist. Auch nach dem Aufruf von "recycle()".
Wenn ich aber FBmpFoto nicht mit drawBitmap() ausgeben, in dem ich die Prorgammzeile auskommentiere, funktioniert recycle() wie es soll, die Eigenschaft mBuffer zeigt dann auf "null" und gc() gibt die 6 MB frei. Es sieht so aus, als würde es durch das drawBitmap() noch irgend einen Verweis auf FBmpFoto geben, der verhindert, dass recycle() den Buffer leer.
Wenn man mal in den Source (V23) bei recycle() nach sieht:
Code:
public void recycle() {
if (!mRecycled && mFinalizer.mNativeBitmap != 0) {
if (nativeRecycle(mFinalizer.mNativeBitmap)) {
// return value indicates whether native pixel object was actually recycled.
// false indicates that it is still in use at the native level and these
// objects should not be collected now. They will be collected later when the
// Bitmap itself is collected.
mBuffer = null;
mNinePatchChunk = null;
}
mRecycled = true;
}
}
Nach dem Kommentar scheint es so, dass das Bitmap noch auf einem "native level" verwendet wird. Es wird auch nicht später freigegeben.
Hat jemand eine Idee, warum drawBitmap() einen aktiven Verweis auf das native Bitmap hinterlässt uind wie man es verhindern oder aufheben kann?
Kann man noch irgenwie anderes das Bitmap freigeben?
Gibt es irgendeine Möglichkeit das Canvas-Objekt (was vermutlich der Übeltäter ist) zu zerstören oder zumindest zu veranlassen, den Verweis auf das Bitmap zu löschen?
Zuletzt bearbeitet von einem Moderator: