rolandl
rolandl

Reputation: 1887

Android out of memory error while rotate a bitmap

I am currently working on a project in which one I would like to rotate a bitmap.

The first time, I create my bitmap with the following code :

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

Then I rotate the bitmap using the following code :

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

I works, but after several times, the memory increases and I have the following exception :

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

It seems that the old bitmaps are still in memory. How to delete/recycle them in order to save the memory ?

Thank your for your help.

Upvotes: 0

Views: 756

Answers (2)

Sachin Aggarwal
Sachin Aggarwal

Reputation: 1135

In my case, the problem was with the size of the bitmaps I was using. The bitmaps I was using were of very high pixels for the given device. In such case, Android system has to descale them to lower pixel density i.e. the one that will suit your device. When you rotate the bitmap, Android system takes up a lot of memory to descale it to lower pixels. Also, Android gets busy and in some cases results in UI thread blocking. Also, increase the heap size in your manifest file.

Upvotes: 0

Gaetano Dati
Gaetano Dati

Reputation: 97

I can suggest you to use Glide library from Github.

This library works in background threads. Anyway you can perform your rotation on Background like this:

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

Upvotes: 0

Related Questions