2017-08-19 4 views
0

Ich arbeite gerade an einem Projekt, in dem ich eine Bitmap drehen möchte.Android-Speicherfehler beim Drehen einer Bitmap

Das erste Mal, erstelle ich meine Bitmap mit dem folgenden Code:

myBitmap = BitmapFactory.decodeResource(getResources(), drawableResource); 

Dann drehe ich die Bitmap mit dem folgenden Code:

final Matrix matrix = new Matrix(); 
matrix.postRotate(currentRotate); 
myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, directionBitmap.getWidth(), directionBitmap.getHeight(), matrix, true); 

ich funktioniert, aber nach mehrmaligem, die Speicher erhöht sich und ich habe folgende Ausnahme:

java.lang.OutOfMemoryError: Failed to allocate a 119071756 byte allocation with 16775968 free bytes and 96MB until OOM

Es scheint, dass das alte Bit Karten sind noch im Speicher. Wie lösche/recycle sie, um den Speicher zu speichern?

Vielen Dank für Ihre Hilfe.

Antwort

0

In meinem Fall war das Problem mit der Größe der Bitmaps, die ich verwendete. Die Bitmaps, die ich verwendete, hatten sehr hohe Pixel für das gegebene Gerät. In einem solchen Fall muss das Android-System sie entkalken, um die Pixeldichte zu verringern, d. H. Diejenige, die zu Ihrem Gerät passt. Wenn Sie die Bitmap drehen, belegt das Android-System viel Speicherkapazität, um es zu niedrigeren Pixeln zu entkalken. Außerdem wird Android beschäftigt und führt in einigen Fällen zu einer Blockierung der Benutzeroberfläche. Erhöhen Sie außerdem die Größe des Heapspeichers in Ihrer Manifestdatei.

0

Ich kann Ihnen empfehlen, Glide Bibliothek von Github zu verwenden.

Diese Bibliothek funktioniert in Hintergrundthreads. Wie auch immer Sie können Ihre Drehung auf Hintergrund wie folgt durchführen:

runOnUiThread(new Runnable(final Matrix matrix = new Matrix(); 
matrix.postRotate(currentRotate); 
myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, directionBitmap.getWidth(), directionBitmap.getHeight(), matrix, true); 
) 
Verwandte Themen