I am trying to display a big amount of pictures into a viewer I found on a website
It's is working very well with <20 pictures, but after that I got a "OutOfMemory"
I added this code, found on stackoverflow but it looks like it's not enough
bmpOptions.inSampleSize = sampleSize;
bmpOptions.inDither=false; //Disable Dithering mode
bmpOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bmpOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bmpOptions.inTempStorage=new byte[32 * 1024];
How could I improve it ? Here's the full code
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
// check if we are returning from picture selection
if (requestCode == PICKER) {
// the returned picture URI
Uri pickedUri = data.getData();
// declare the bitmap
Bitmap pic = null;
// declare the path string
String imgPath = "";
// retrieve the string using media data
String[] medData = { MediaStore.Images.Media.DATA };
// query the data
Cursor picCursor = managedQuery(pickedUri, medData, null, null,
null);
if (picCursor != null) {
// get the path string
int index = picCursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
picCursor.moveToFirst();
imgPath = picCursor.getString(index);
} else
imgPath = pickedUri.getPath();
// if we have a new URI attempt to decode the image bitmap
if (pickedUri != null) {
// set the width and height we want to use as maximum
// display
int targetWidth = 600;
int targetHeight = 400;
// create bitmap options to calculate and use sample size
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
// first decode image dimensions only - not the image bitmap
// itself
bmpOptions.inDither=false; //Disable Dithering mode
bmpOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bmpOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bmpOptions.inTempStorage=new byte[32 * 1024];
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imgPath, bmpOptions);
// image width and height before sampling
int currHeight = bmpOptions.outHeight;
int currWidth = bmpOptions.outWidth;
// variable to store new sample size
int sampleSize = 1;
// calculate the sample size if the existing size is larger
// than target size
if (currHeight > targetHeight || currWidth > targetWidth) {
// use either width or height
if (currWidth > currHeight)
sampleSize = Math.round((float) currHeight
/ (float) targetHeight);
else
sampleSize = Math.round((float) currWidth
/ (float) targetWidth);
}
// use the new sample size
bmpOptions.inSampleSize = sampleSize;
bmpOptions.inDither=false; //Disable Dithering mode
bmpOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bmpOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bmpOptions.inTempStorage=new byte[32 * 1024];
// now decode the bitmap using sample options
bmpOptions.inJustDecodeBounds = false;
// get the file as a bitmap
pic = BitmapFactory.decodeFile(imgPath, bmpOptions);
// pass bitmap to ImageAdapter to add to array
imgAdapt.addPic(pic);
// redraw the gallery thumbnails to reflect the new addition
picGallery.setAdapter(imgAdapt);
// display the newly selected image at larger size
picView.setImageBitmap(pic);
// scale options
picView.setScaleType(ImageView.ScaleType.FIT_CENTER);
pic.recycle();
}
}
}