1、Android内存分配
Android给每个APK分配相应的内存空间,一般情况下只要APK超过个空间的限制,就会报OOM
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.i("maxMemory:", Long.toString(maxMemory / (1024 * 1024)));
在不考虑largeHeap和native的情况下,当前手机分配的内存空间不能超过384M,这个值的大小和手机的配置也有很大关系,在早期的手机中分配空间可能是几十M,包括现在配置比较低的手机也是分配100多M的内存空间,因此开发者必须合理的分配内存空间,避免OOM
2、Bitmap是造成OOM的主要原因之一
对于APP来说,一般加载的都是json数据,主要包括文本和图片,对于文本几乎是没有优化的空间的,而图片对内存的消耗是非常大的,特别是没有经过处理的高清大图。因此开发者需要特别重视对Bitmap图片的处理。
3、高效加载Bitmap
1、采样率压缩
原理:降低图片像素,减小内存占用
1)设置采样率为true
2)取出原始图片宽高
3)设置采样率
4)设置采样率为flase,重新加载图片
示例:
public static Bitmap compressImageToBitmap(String imagePath){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);
options.inJustDecodeBounds = false;
options.inSampleSize = 2;
bitmap = BitmapFactory.decodeFile(imagePath,options);
return bitmap;
}
2、质量压缩
原理:改变图片人深度和透明度,减少图片区域某些点相近的像素
示例:
public static void qualityCompress(Bitmap bmp, File file) {
// 0-100 100为不压缩
int quality = 20;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把压缩后的数据存放到baos中
bmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3、尺寸压缩
原理:减少图片的宽高来降低像素
public static void sizeCompress(Bitmap bmp, File file) {
// 尺寸压缩倍数,值越大,图片尺寸越小
int ratio = 8;
// 压缩Bitmap到对应尺寸
Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
canvas.drawBitmap(bmp, null, rect, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把压缩后的数据存放到baos中
result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}