Android作为一种移动设备,它的内存和cup都有了一定的限制。无法做到像pc那样,超大内存和高性能的cpu。这也意味着Android程序不能无限制的使用内存和cpu。过多的使用内存会导致oom,俗称内存溢出。过多的使用cpu资源,则会导致程序变得很卡,甚至出现anr。因此对程序员的要求也就更高了。下面我对Android的优化做一个介绍:



1/ 布局优化

布局优化的思想很简单,主要是减少布局的层级关系,只要层级关系少了,自然就快了。首先,删除布局中无用的控件和层级;其次就是在groupview的选择上,比如用linnearlayout 和relaytivelayout 都可以实现的布局,我们尽量选用linnearlayout来进行布局。因为relaytivrlayout 布局比较复杂,他的耗时要比linnearlayout要长。但是如果需要多个linnearlayout嵌套才能完成的布局,还是建议使用relaytivelayout 。

还有一种就是使用include标签,merge标签,viewstub标签。include主要是用在布局重用上,merge标签一般和include配合使用,以减少层级关系。viewstub则按需求加载的,只有使用到的时候才会加载。

2 自定义布局的优化

 自定义布局优化主要有在ondraw()方法中避免执行大量的绘制工作:


在ondraw中不要创建新的布局对象,因为ondraw方法会可能被频繁的调用,这样就会产生大量的临时对象。这样不仅占用了过多的内存,而且很容易gc。

在ondraw方法中不要做好事操作,也不能执行成千上万次的循环操作,及时循环是很轻量级的。这样会造成界面的绘制过程不流畅,还有谷歌规定每针的绘制时间不能超过16毫秒。我们虽然不能保证,但是也要尽量减少。


3 内存泄露优化

内存泄露是一个比较重要的东西,但是对于程序员的经验和能力要求比较高,很多程序员考虑不到,很容易造成的泄露的错误。内训泄露主要优化在两个方面,

      (1) 在开发过程中避免写会内存泄漏的代码。

      (2) 通过一些工具比如mat来找出可能潜在的内存泄漏,来解决。

内存泄露主要有以下几个方面:

    1.静态棉量导致的内存泄漏  比如上下问静态,view定义静态 这个错误很明显,估计大家都不会犯

     2.单列模式导致的内存泄漏  单列模式的内存泄露就比较的隐秘了,比如我们把activity 中view的监听事件封装起来,放到单列模式中。大家都知道单列模式的生命周期是和         application一致的。会导致activity无法及时释放。

     3. 属性动画导致的内存泄露 在Android3.0之后谷歌推出了属性动画的包。有些动画是无限循环的,如果在ondestroy中没有去停止动画,虽然我们看不见动画效果啦,但是            activity 的view 还在被动画持有,并没有得到释放。

4 响应速度优化和anr日志分析   

一般避免在主线程做耗时操作,但是无法避免的情况下,我们可以再在子线程中做耗时操作。当然一些比较隐蔽的anr我们是不能看出来的,这时候,我们就需要倒出traces文件来进行分析。

5listview和bitmap的优化

首先做viewholder来做布局的重复加载问题并避免在gitview中执行耗时操作,其次根据listview的滑动状态来控制任务的执行频率(比如快速的滑动是不能执行大量的异步任务的);最后开启硬件加速来优化listview;图片加载的优化主要是对图片的内存和缓存的处理以及bitmap的释放。要会使用bitmapfactory.options。

6 线程优化 它的优化思想就是避免使用太多的thread,建议使用线程池。


优化建议

避免创建过多的对象

避免创建过多的成员变量

不要过多的使用枚举类型,它占用内存要比整型大

常量请使用static final来修饰

用比如sparsearray来代替list 或者pair等 他们都具有更好的性能

适当的使用软引用和弱引用

采用缓存和磁盘缓存

尽量采用静态内部类,这样可以避免由于内部类导致的内存泄露