Nach bitmap.recycle () oder nicht nach bitmap.recycle ()

9

Vor ein paar Tagen haben wir eine App im Play-Store veröffentlicht, die sich mit qualitativ hochwertigen Bitmaps beschäftigt und sich nur darum kümmert, sie zu bearbeiten.

Alles lief gut, als wir feststellten, dass 20% der Geräte keine Speicherfehler mehr hatten. Also haben wir unseren Code überprüft und festgestellt, dass Android keinen nativen Speicher freigibt, der zum Speichern von Bitmap-Daten auf einigen Geräten verwendet wird. In diesem Fall haben wir den Befehl recycle begrüßt.

Die Speicherfehler sind verschwunden (zumindest bei HD-Geräten). Wie auch immer, wir waren glücklich. Aber heute begannen wir zu sehen, dass 50% der Geräte einen weiteren Fehler zeigten: "Kann eine recycelte Bitmap nicht kopieren"

Wir waren enttäuscht. Auf zwei bitmap.copy () -Zeilen in unserem Code kann die Hälfte der Geräte diese zwei Zeilen nicht synchron ausführen:

%Vor%

Also haben wir das Recycling entfernt und ein weiteres Update veröffentlicht. Wir haben uns dafür entschieden, die Bildschirmgröße des Geräts zu begrenzen, so dass uns kleine keine schlechte Bewertung geben.

Hier ist meine Frage. Warum können einige Geräte vor dem Recycling kopieren, und die Hälfte nicht?

Ich lese Googles bitmap-bezogene Dokumentation und wusste bereits, wie Bitmap auf Heap und nativem Heap von vmm gespeichert wird, wie die Garbage Collection auf Speichermangel funktioniert usw. Der Beispielcode, den Google zum Laden und Bearbeiten von großen Bitmaps bereitstellt, ist nahezu identisch wie unsere.

Lesen Sie viele Blogs, Google Group Threads, Github-Code-Beispiele ... Ich denke, ich brauche immer noch eine gute Dokumentation / Buch über Android-Bitmaps.

PS: Wir verwenden bereits inSampleSize, um Bitmaps zu skalieren, während sie dekodiert werden.

BEARBEITEN - Hier sind einige Daten aus den Absturzberichten:

Alle Geräte sind nicht gerootet. In den meisten Fällen liegt der verwendete Speicher zwischen 25% und 35%.

%Vor%     
emrahgunduz 20.08.2015, 19:13
quelle

1 Antwort

0

Sind Sie wirklich sicher, dass aus irgendeinem Grund

bitmap.copy (..)

wird nicht zweimal aufgerufen?

d. h .:

  

// zuerst Bitmap aufrufen anotherBitmap = bitmap.copy (bitmap.getConfig (),   wahr ); bitmap.recycle ();

     

[...]

     

// zweiter Aufruf Bitmap anotherBitmap = bitmap.copy (bitmap.getConfig (),   wahr ); bitmap.recycle ();

    
Alessandro Verona 03.09.2015 12:38
quelle

Tags und Links