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等 他们都具有更好的性能
适当的使用软引用和弱引用
采用缓存和磁盘缓存
尽量采用静态内部类,这样可以避免由于内部类导致的内存泄露