本文章为从各网上各处搜集并结合自身开发经验对安卓内存的优化方案,不存在深层次原理讲解,见谅Bitmap是消耗内存的大户,绝大部分的OOM都是由Bitmap造成的下面为几个处理图片的方法
1.图片显示
当列表展示图片时展示缩略图,点击具体查看详细信息时另启动一个activity/fragment/dialog显示详情图片PS:我使用展示图片列表的方式为,将图片的路径存储为JavaBean中,无论是列表还是详情都加载javaBean中的路径,目前尚未出现因为列表加载图片造成OOM的情况,但不抛出以后不会有2.图片大小直接使用ImageView显示Bitmap会占用比较多资源,特别是图片较大的时候可能会导致崩溃使用BitmapFactory.Options设置inSampleSize这样可以减少对系统资源的要求属性值inSapleSize表示缩略图为原始大小的几分之一,如果这个值为2则取出的缩略图的宽和高都是原始图片的1/2图片大小就为原始图片大小的1/4BitmapFactory.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设备中,浮点数会比整型慢两倍
Android菜鸟练习第二十六课 Android常用内存优化方法
最新推荐文章于 2024-07-06 10:31:17 发布