Please take a look at my related question:
High Resolution Image - OutOfMemoryError
Try to minimize memory usage in the application by keeping the background image as small as possible.
This can be done with:
- crop image to fit screen
- compress the image further (use, for example, Photoshop) before using it in the application
- use the method below to load a bitmap.
- reload the bitmap as soon as you don't need it.
- make sure you do not store multiple instances in memory
- set to null after using a bitmap
Make sure that the images you set as the background are loaded correctly (for example, cropped to fit, for example, fit the screen size) and freed from memory as soon as they are no longer needed.
Make sure that there is only one instance of your bitmap in memory. After displaying it, call recycle() and set your link to null.
Here's how you can upload images:
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // Calculate ratios of height and width to requested height and width final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // Choose the smallest ratio as inSampleSize value, this will guarantee // a final image with both dimensions larger than or equal to the // requested height and width. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
Thanks to Adam Stelmaszczyk for this wonderful piece of code.
Philip jahoda
source share