在Android应用中由于系统本身的限制,系统分给每个APP进程内存大小都有限制,一般是16M,,为了节省内存,我们不得不竭尽所能,对于BitMap优化,我有以下建议:
1:通多BitMapFactory.options ,缩小尺寸,SDK中建议以2的指数值进行缩放;在Android加载图片到内存时,一张图片占用内存的大小算法是长*宽,也就是这张图片的像素点,所有的像素点都是存放在对应的数组中
2:在对图片本身操作时,应尽量不要使用SetImageBitMap,setImageResource,BitMapFactory.decodeResource 来设置一张大图,因为这些方法在完成Decode(解码)功能后,最终都是通多Java层的createBitMap()方法来完成的,这需要消耗更多的内存,应该通多BitMapFactory.decodeStream() 方法创建一个bitMap,然后再将其设置为ImageView的source。decodeStream 的最大优点是直接调用JNI>>nativeDecodeAsset()来完成的decode,从而节省加载时的内存,使用decodeStream()直接读取字节码,不会根据机器的各种分辨率自动适应,需要自行处理,红色部分是是调用JNI层获取一张BitMap;
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) {
// we don't throw in this case, thus allowing the caller to only check
// the cache, and not force the image to be decoded.
if (is == null) {
return null;
}
Bitmap bm = null;
Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap");
try {
if (is instanceof AssetManager.AssetInputStream) {
final int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
bm = nativeDecodeAsset(asset, outPadding, opts);
} else {
bm = decodeStreamInternal(is, outPadding, opts);
}
3:图片回收,在用完之后记得bmp.recycle();