I have an Android app in which I work with really large images (640x480)
and a bit more. These are actually pictures taken with the camera, then edited, then saved to sdcard
and finally uploaded to the server. But the problem I ran into is VM memory exceeded
while working with bitmaps
.
I am doing something like this:
In the first step, I get the bytes from the camera
and create a bitmap
that is edited and then saved to sdcard
BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; options.inDither = true; byte[] imageData = extras.getByteArray("imageData"); myImage = BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); Matrix mat = new Matrix(); mat.postRotate(90); if(myImage !=null){ bitmapResult = Bitmap.createBitmap(myImage.get(), 0, 0, (myImage.get()).getWidth(), (myImage.get()).getHeight(), mat, true);
in onPause()
I did this:
bitmapResult.recycle(); bitmapResult=null;
In my second step, I read the file from sdcard
and show it on the screen. Why? I have my reasons:
File f=new File("/sdcard/Images/android.jpg"); BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inTempStorage = new byte[16*1024]; o2.inSampleSize=8; o2.outWidth=100; o2.outHeight=100; try { x = BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(x != null){ myImage.setImageBitmap(x); }
And did the same in onPause()
x.recycle(); x=null;
All this did not work and after a few shots my application crashed.
I tried using WeaakReference
instead of bitmap
:
myImage = new WeakReference<Bitmap>(BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options));
And yet nothing .... the same error .... out of memory
.
Does anyone have any ideas?
PS: I also tried calling System.gc()
, but with the same result!
So please help me!