Android菜鸟练习第二十六课 Android常用内存优化方法

本文章为从各网上各处搜集并结合自身开发经验对安卓内存的优化方案,不存在深层次原理讲解,见谅

Bitmap是消耗内存的大户,绝大部分的OOM都是由Bitmap造成的下面为几个处理图片的方法
 1.图片显示
当列表展示图片时展示缩略图,点击具体查看详细信息时另启动一个activity/fragment/dialog显示详情图片
PS:我使用展示图片列表的方式为,将图片的路径存储为JavaBean中,无论是列表还是详情都加载javaBean中的路径,目前尚未出现因为列表加载图片造成OOM的情况,但不抛出以后不会有
2.图片大小
直接使用ImageView显示Bitmap会占用比较多资源,特别是图片较大的时候可能会导致崩溃
使用BitmapFactory.Options设置inSampleSize这样可以减少对系统资源的要求
属性值inSapleSize表示缩略图为原始大小的几分之一,如果这个值为2则取出的缩略图的宽和高都是原始图片的1/2图片大小就为原始图片大小的1/4
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds = true;
bitmapFactoryOptions.inSampleSize = 2;
// 这里一定要将其设置回false,因为之前我们将其设置成了true    
// 设置inJustDecodeBounds为true后,decodeFile并不分配空间,即,BitmapFactory解码出来的Bitmap为Null,但可计算出原始图片的长度和宽度    
bitmapFactoryOptions = false;
Bitmap bmp = BitmapFactory.decodeFile(sourceBitmap, options);

3.图片像素
Android中图片有四种属性分别是:
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存
RGB_565:每个像素占用2byte内存
Andoid默认颜色模式为ARGB_8888,这个颜色模式色彩最细腻显示质量最高,但占用内存最大所以在对图片效果要求不是特别高的情况下使用RGB_565(没有透明度属性)
public static Bitmap readBitMap(Context context, int resId) {
    BitmapFactory.Optionsopt = new BitmapFactory.Options();
    opt.inPreferredConfig = Bitmap.Config.RGB_565;
    opt.inPurgeable = true;
    opt.inInputShareable = true;
    //获取资源图片   
    InputStreamis = context.getResources().openRawResource(resId);
    return BitmapFactory.decodeStream(is, null, opt);
}

   
   
4.图片回收
使用Bitmap过后,就需要及时的调用Bitmap.recycle()方法来释放Bitmap占用的内存空间,而不要等Android系统来释放,下面是释放Bitmap的示例代码片段
if(bitmap != null && !bitmap.isRecycled()){
    // 回收并且置为null  
    bitmap.recycle();
    bitmap = null;
}
System.gc()
如果不调用bitmap.recycle()也不调用System.gc();则内存占用17MB
如果只调用bitmap.recycle()不调用System.gc();则内存占用17MB
如果不调用bitmap.recycle()只调用System.gc();则内存占用17MB
如果同时调用bitmap.recycle()和System.gc();则内存占用7.4MB

5.捕获异常
经过上面这些优化后还会存在报OOM的风险,所以下面就需要最后一道管卡捕获OOM异常
Bitmap bitmap = null;
try {
    bitmap = BitmapFactory.decodeFile(path);// 实例化Bitmap  
} catch (OutOfMemoryError e) {//捕获OutOfMemoryError,避免直接崩溃  
}
if (bitmap == null) {  
    return defaultBitmap;//如果实例化失败 返回默认的Bitmap对象
}
图片缓存也是优化内存管理的方法,关于图片缓存的内容回另外新建一篇文章进行说明
其他
1静态方法代替虚拟方法
如果不需要访问某对象的字段,将方法设置为静态调用会加速15%到20%。
2减少不必要的全局变量
尽量避免static成员变量引用资源耗费过多的实例,比如Context
因为Context的引用超过他本身的生命周期,会导致Context泄露。所以尽量使用Application这种Context类型。可以通过Context.getApplicationContext()或Activity.getApplication()轻松得到Application对象
3避免创建不必要的对象
最常见的一个例子当需要频繁操作一个字符串时使用StringBuffer代替String
总体来说,就是避免创建短命的临时对象,减少对象的创建就能减少垃圾收集,进而减少用户体验的影响。
4避免使用浮点数
通常的经验是,在Android设备中,浮点数会比整型慢两倍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值