Android内存优化

       随着硬件设置的不断发展,手机内存从原来的kb单位,发展到现在的G为单位,但是手机内存总还是有限的,所以我们就要在开发当中尽量的做到内存的优化。


1,首先应该知道哪些原因可能bitmap内存消耗过大,导致OOM

      这个问题是android开发一直伴随我们的问题,解决问题也是老生常谈,可以通过以下步骤来减少内存消耗:

(1),图片的大小(面积)的压缩,下面是一段熟悉的代码

  1. BitmapFactory.Options bitmapFactoryOptions =new BitmapFactory.Options();
  2. bitmapFactoryOptions.inJustDecodeBounds =true;//设置成true只能度,这样只能读出图片的大小不能得到图片
  3. bitmapFactoryOptions.inSampleSize =2;//缩小为原来的二分之一
  4. // 这里一定要将其设置回false,因为之前我们将其设置成了true
  5. // 设置inJustDecodeBounds为true后,decodeFile并不分配空间,即,BitmapFactory解码出来的Bitmap为Null,但可计算出原始图片的长度和宽度
  6. options.inJustDecodeBounds =false;
  7. Bitmap bmp = BitmapFactory.decodeFile(sourceBitmap, options);  

(2),图片像素

Android图片中有四中属性,分别是:

ALPHA_8:每个像素占用1byte内存

ARGB_4444:每个像素占用2byte内存

ARGB_8888:每个像素占用4byte内存(默认的)

RGB_565:每个像素占用内存2byte内存

占用内存越大显示图片质量越好,但是鱼和熊掌不能兼得,如果对图片质量要求没那么高我们可以选择低内存的设置,

如经常用到的RGB_565(没有透明度属性),示例代码如下:

  1. publicstaticBitmapreadBitMap(Contextcontext, intresId) {
  2. BitmapFactory.Optionsopt = newBitmapFactory.Options();
  3. opt.inPreferredConfig = Bitmap.Config.RGB_565;
    1.  /* 如果 inPurgeable 设为True的话表示使用BitmapFactory创建的Bitmap
    2. * 用于存储Pixel的内存空间在系统内存不足时可以被回收,
    3. * 在应用需要再次访问Bitmap的Pixel时(如绘制Bitmap或是调用getPixel),
    4. * 系统会再次调用BitmapFactorydecoder重新生成Bitmap的Pixel数组。
    5. * 为了能够重新解码图像,bitmap要能够访问存储Bitmap的原始数据。
    6. *
    7. * 在inPurgeable为false时表示创建的Bitmap的Pixel内存空间不能被回收,
    8. * 这样BitmapFactory在不停decodeByteArray创建新的Bitmap对象,
    9. * 不同设备的内存不同,因此能够同时创建的Bitmap个数可能有所不同,
    10. * 200个bitmap足以使大部分的设备重新OutOfMemory错误。
    11. * 当isPurgable设为true时,系统中内存不足时,
    12. * 可以回收部分Bitmap占据的内存空间,这时一般不会出现OutOfMemory错误。
    13. */
  4. opt.inPurgeable =true;//简单一句话内存不足的时候,可以清楚
  5. opt.inInputShareable =true;//;// 以上options的两个属性必须联合使用才会有效果
  6. //获取资源图片
  7. InputStreamis = context.getResources().openRawResource(resId);
  8. returnBitmapFactory.decodeStream(is,null, opt);
  9. }  

(3),图片的回收:

在使用完bitmap之后,要及时的进行手动回收,从而保障内存少的浪费

  1. // 先判断是否已经回收
  2. if(bitmap != null && !bitmap.isRecycled()){
  3. // 回收并且置为null
  4. bitmap.recycle();
  5. bitmap =null;
  6. }
  7. System.gc();  

(4),在有可能出现问题的地方尽量try......catch,避免程序的崩溃

  (5),下载图片的流程

为了加快图片的加载速度,流行的加载方法是三级缓存方法①现存内存中取数据②内存取不到,异步从本地取,然后在存入缓存③本地取不到,异步从网络取图,然后存入本地存入缓存。最常用的图片存取的算法是LRU,重要类是lrucache。

2,对于数据库中的cursor,流操作时要注意末尾要close掉。


3,尽量避免static成员变量引用资源耗费过多的实例


       比如Context因为Context的引用超过它本身的生命周期,会导致Context泄漏。所以尽量使用Application这种Context类型。 你

可以通过调用Context.getApplicationContext()或 Activity.getApplication()轻松得到Application对象。 


4,尽量少创建不必要的对象和重复创建对象,如果一个对象说在多出使用尽量使用单例模式进项创建,String中不要使用太多的+"",没加一次都会创建新的对象,对象的创建泛滥会导致堆内存的大量浪费。


5,大家都知道android界面是解析xml树形结构而得到的,这时候如果树形结构太“深”就会增加内存的消耗,简洁的布局结构也是内存优化的关键。


6,long占8个,float占8个,double占16个如果没必要尽量避免使用这些占用内存比较大的数据类型


7,如果内存要求比较严格的时候尽量避免使用枚举类型。


8,for循环的时候要尽量避免使用双层嵌套,同时不要在for中调用任何其他方法


9,adapter适配器使用的时候经典的convertview和viewholder的使用,避免了每次创建新的界面。

10,pooL池的思想,如线程池,String,等这些避免了对象的过度创建。


11,多看一下java的开发模式,让代码要尽量符合面相对象的思想,做到易维护,易扩展,易复用,灵活多变

12,在做网络请求的时候避免过度访问,最好做一下本地缓存。

参考:http://blog.csdn.net/hewence1/article/details/39004301

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些Android内存优化的方法: 1. 使用Android内存管理工具 Android提供了一些内存管理工具,如hprof-conv,dumpsys和adb shell am命令等,可以帮助你检查内存占用情况,并找出内存泄漏等问题。 2. 优化布局 避免使用过多的布局嵌套,尽量使用ConstraintLayout等可减少嵌套的布局,以减少内存占用。 3. 优化资源文件 对于大型的图片和其他资源文件,可以使用压缩算法减少其占用内存的大小,减少应用的内存占用。 4. 使用缓存机制 使用缓存机制可以减少从网络或磁盘中读取数据的次数,降低了内存的使用。 5. 控制加载数据的数量 为了减少内存占用,应该控制加载数据的数量。例如,在列表中,仅加载视图范围内的数据。 6. 使用分页加载 分页加载可以分多次将数据加载到内存中,而不是一次性将所有数据加载到内存中。 7. 释放不使用的资源 及时释放不使用的资源,例如:Activity中的布局文件、Bitmap等等。 8. 避免使用静态变量 静态变量可以保存状态和数据,但它们生命周期较长,在某些情况下可能需要较长时间才能释放它们的内存。因此,最好避免使用静态变量。 9. 使用BitmapFactory.Options参数 使用BitmapFactory.Options参数可以在加载大型图片时控制它们的大小和内存占用。例如,可以使用inSampleSize参数减小图片的大小。 总之,Android内存管理是复杂而重要的部分,应该重视内存优化。以上的方法只是一些参考,需要结合具体应用场景来进行优化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值