Android性能优化

一.为什么需要性能优化:

Android作为移动设备,相比较于pc端而言,在内存和cpu的性能方面都有了很大的限制,不像pc端就有很高的内存和cpu性能,过多的内存调用,有很大的可能性造成内存溢出.过多的使用cpu资源,一般是指做大量的耗时操作,由于在Activity超过5秒回出现ANR(Application No Responsing),广播是十秒,service是二十秒.为了提高用户的良好的用户体验和提高程序的性能,需要对性能进行优化.

二.从那几个方面进行性能优化:

主要是下面几个方面记行性能的优化操作;

1.布局优化  

2. 绘制优化

3.内存泄漏优化

4.相应速度的优化

5.listview的优化

6.Bitmap的优化

7.线程优化等

三.具体放入说明:

1.##布局优化:

第一点就是: 能使用LinearLayout和FrameLayout布局来实现的尽量不适用RelationLayout俩实现,要是实现不了使用相对布局,但是相对布局的嵌套层级尽量减少,是的绘制的过程所需要的时间大大的减少.

第二点就是; 使用#include标签,达到布局的复用;还可以使用<merge>标签和<ViewStub>标签;一般来说<include>标签和<merge>标签是搭配使用的;

<ViewStub>提供了按需加载的功能.需要的时候才会将ViewStub中的布局加载到布局的内存中.

对于### <ViewStub>的简单说明 :

>第一就是: ViewStub是继承View的;是一个非常轻量级的控件,并且他的宽和高都是0;
>第二点: 他不参与任何的布局和和绘制过程.

2.##绘制优化:

是指 View的onDraw()方法避免执行大量的操作;主要体现在连个方法:
第一: onDraw()中不要创建大量的局部对象
第二: onDraw()  不要做耗时操作.

3.##内存泄漏优化

 常识: 内存溢出(OOM):申请内存的时候,没有足够的空间,就会报内存溢出的问题.
           内存泄漏:申请内存后,没有释放已申请的内存空间,内存泄漏或导致内存溢出; 

 内存泄漏的优化方面:

第一就是避免写出内存泄漏的代码
第二:使用分析工具找到内存泄漏的代码:

>Android内存优化策略:
1)在循环内尽量不要使用局部变量
2)不用的对象即时释放,即指向NULL 
3)数据库的cursor即时关闭。
4)构造adapter时使用缓存contentview
5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver()
6)即时关闭InputStream/OutputStream。
7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle 
8)尽量避免static成员变量引用资源耗费过多的实例。

 ###内存泄漏中常见的造成的方式;
 第一就是 : 使用静态变量导致内存泄漏
第二就是:单例模式导致的内存泄漏    原因就是; 单例模式的声明周期和appliaction的生命周期的一致的.
第三就是: 属性动画导致的内存泄漏

4.##响应速度优化

尽量不要在主线程中执行耗时操作,activit相应的时间是五秒,广播是10面,intentService是20秒,不然会出现ANR现象.

5.##listview优化

listview的不复用缓冲也会造成内存泄漏或内存溢出;
listview的优化: 第一: 就是复用缓冲
第二: 使用viewholder来设置控件的获取
第三: 就是分页加载和图片的异步加载(也就是三级缓存思想,内存,sd,最后是网络)
分页加载就是设置获取的页数,确定每一页加载的数量,设置listview的滚动监听事件,当listview定制滑动,并且滑动到listvie的最后一页的情况下,我们再去获取下一页的数据;
 
###listview在加载过程中出现的问题:

    大牛的博客连接:Android ListView异步加载图片乱序问题
    [http://blog.csdn.net/guolin_blog/article/details/45586553](http://blog.csdn.net/guolin_blog/article/details/45586553 "Android ListView异步加载图片乱序问题,原因分析及解决方案 ")
自己总结: 
  造成的原因就是我们在设置图片的时候,我们在滑动的时候,由于获取解析图片是一个比较耗时的操作,那么第一个题目或许还没有解析完全,我们滑动不可见,此时原先第一个条目解析完全,会设置现在的第一个位置,出现图片的错位.
解决方法:

第一种方法就是;在findviewbyid的时候设置一个标签,到时根据是否设置了tag来设置t图片,设置图片就会有tag,没有就没有设置图片,就不会错位了!
第二种的方法:使用软引用 
第三种: 使用 NetWorkImageView控件  是在Volley中提供的,里面已经给我实现好了!


6.##bitmap优化

Bitmap使用过多,没有及时的回收也会造成内存泄漏或者内存已溢出;
###Lru (Least Recently Used) 这是一个算法,最近最少使用原则; 核心思想就是; 当缓冲快满的时候,会淘汰近期最少使用的缓冲目标.

### BitMap高效的加载展示图片使用Options来设置加载图片信息.
通过使用BitMapFactory.Options来缩放图片,主要用到了他的inSampleSize参数,也就是我们说的采样率;当inSampleSize的大小为1的时候,采样后的图片为原始的大小,
当inSampleSize的值为2的话,我们采样后的图片的高和宽都是原图的二分之一,大小是原图的四分之一;采样率对图片的高和宽都有效果.
### Bitmap加载大图片的处理
第一种就是: 等比例缩小图片,也就是使用采样率来;
第二种就是:压缩质量  或者使用第三方框架
android系统给图片分配的内存只有8M,当加载大量图片时往往会出现OOM。
Android加载大量图片内存溢出解决方案:
1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source 
2)使用BitmapFactory.Options对图片进行压缩
 InputStream is = this.getResources().openRawResource(R.drawable.pic1);
 BitmapFactory.Options options=new BitmapFactory.Options();
 options.inJustDecodeBounds = false;
 options.inSampleSize = 10; //width,hight设为原来的十分一
 Bitmap btp =BitmapFactory.decodeStream(is,null,options); 
3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载
及时销毁不再使用的Bitmap对象
 if(!bmp.isRecycle() ){
 bmp.recycle() //回收图片所占的内存
 system.gc() //提醒系统及时回收
 }

7.线程优化:

核心思想: 就是使用线程池来管理线程,线程池可以理解为一个存放线程的一个池子,只不过里面有是已经创建好的线程,使用的时候直接使用创建好的线程,避免了线程的大量创建和销毁,线程池还能有效的控制线程的最大并发数:避免大量的线程因为抢夺系统资源而导致阻塞现象的发生.

  具体的链接: Android中的线程和线程池及其源码分析:

Android中线程和线程池及其异步加载



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值