您的位置:首页 > 移动开发 > Android开发

android--BitMap 你应该记住的一些事-1

2013-11-19 11:26 369 查看
[1].Mobile devices typically have constrained system resources. Android devices can have as little as 16MB of memory available
to a single application.

[2].Each
type of decode method has additional signatures that let you specify decoding options via the 
BitmapFactory.Options
 class.
Setting the 
inJustDecodeBounds
 property
to 
true
 while
decoding avoids memory allocation, returning 
null
 for
the bitmap object but setting 
outWidth
outHeight
 and 
outMimeType
.
This technique allows you to read the dimensions and type of the image data prior to construction (and memory allocation) of the bitmap.

[3].

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) {

final int halfHeight = height / 2;
final int halfWidth = width / 2;

// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}

return inSampleSize;
}

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);
}


[4].Note: In
the past, a popular memory cache implementation was a 
SoftReference
 or 
WeakReference
 bitmap
cache, however this is not recommended. Starting from Android 2.3 (API Level 9) the garbage collector is more aggressive with collecting soft/weak references which makes them fairly ineffective. In addition, prior to Android 3.0 (API Level 11), the backing
data of a bitmap was stored in native memory which is not released in a predictable manner, potentially causing an application to briefly exceed its memory limits and crash.

[5].Note: In
this example, one eighth of the application memory is allocated for our cache. On a normal/hdpi device this is a minimum of around 4MB (32/8). A full screen 
GridView
 filled
with images on a device with 800x480 resolution would use around 1.5MB (800*480*4 bytes), so this would cache a minimum of around 2.5 pages of images in memory.

[6].A
memory cache is useful in speeding up access to recently viewed bitmaps, however you cannot rely on images being available in this cache. Components like 
GridView
 with
larger datasets can easily fill up a memory cache. Your application could be interrupted by another task like a phone call, and while in the background it might be killed and the memory cache destroyed. Once the user resumes, your application has to process
each image again.

[7].Note: A 
ContentProvider
 might
be a more appropriate place to store cached images if they are accessed more frequently, for example in an image gallery application.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android BitMap