1.Android的性能优化方法
1.1布局优化
尽量减少布局文件的层级。在可以使用LinearLayout,可以使用RelativeLayout的情况下,使用LinearLayout,这个是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的Cpu时间。但是如果纯需要LineaLayout和FrameLayout不能实现需要嵌套的情况下建议使用RelativeLayou。因为嵌套会增加布局的层级,降低性能。
采用<include>标签、<merge>标签和ViewSub。<include>标签主要用于布局重用,<merge>标签一般和<include>配合使用,可以降低减少布局的层级,而ViewSub提供了按需需求加载的功能,当需要时才会将ViewStub中的布局加载到内存。
1.2绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作。主要体现在两方面,一方面是:onDraw中不要创建新的布局对象,这是因为onDraw方法可能会频繁调用,这样就会在一瞬间产生大量的临时对象,这样不仅占用了过多的内存而且还会导致系统频繁gc,降低了程序的执行效率。另一方面是:onDraw不要执行耗时的任务,也不能执行成千上万次的存缓操作。
1.3内存泄露优化
内存泄露优化分为两个方面,一方面是在开发过程中避免写出有内存泄露的代码,另一方面是通过一些工具比如MAT来找出潜在的内存泄露而解决。
场景1:静态变量导致的内存泄露。
场景2:单例模式导致的内存泄露
属性动画导致的内存泄露,如果在Activity中播放这些动画,而米有在onDestory中去停止动画,那么动画会一直播放下去,尽管已经无法子在界面上看到动画效果了,并且这个时候Activity的View会被动画持有,而View又持有Activity,最重Acivity无法释放。解决方法是在Activity的onDestory中调用animator.cancel()来停止动画。
1.4响应速度优化和ANR日志分析
响应速度优化的核心思想是避免在主线程中做耗时操作,但是有时候的确有很多耗时操作时放在线程去执行。如果主线程中做太多事情,会导致Acitivity启动时出现黑屏,甚至是ANR。当一个进程中遇到ANR以后,系统会在/date/anr目录创建一个文件traces.txt.
1.5 ListView和Bitmap优化
ListView优化:第一:采用ViewHolder并避免在getView中执行耗时操作。第二:更据列表的滑动状态来控制任务的执行频率。第三:可以尝试开启硬件加速来使ListView的滑动更加流畅。
Bitmap同通过BitmapFactory.Options来根据需要对图片进行采样。
1.6线程优化
主要思想是采用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,从而避免大量的线程因创建和销毁所带来的性能开销,同时线程还能有效地控制的最大并发数,避免大量的线程因相互抢占系统资源从而导致阻塞现象的发生。
1.7 一些性能优化建议
避免创建过多的对象。
不要过多使用枚举,枚举占用的内存空间要比整型大。
常量请使用static final来修饰
使用一些Android特有的数据结构
适当使用软引用和弱引用
采用内存缓存和磁盘缓存
尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露。
2.内存泄露分析之MAT
MAT不需要安装,下载后解压既可以使用,MAT提供了很多功能,但是最常用的只有Histogram和DominatorTree,通过Histogram可以直观地看出内存中不同类型的buffer的数量和占用的内存大小,而Dominator Tree则把内存中的对象按照从大到小的顺序进行排序,并且可以分析对象之间的引用关系。
3.提高程序的可维护性
(1)命名要规范,要正确地传达出变量或者方法的含义,少用缩写,关于变量的前缀可以参考Android源码的命名方法。
(2)代码的排版上需要留出合理的空白来区分不同的代码块,其中同类变量的声明要放在一组,两类变量之间要留出一行空白作为分区。
(3) 仅为非常关键的代码添加注释,其他地方不写注释,这就对变量和方法的命名格式提出了很高的要求,一个合理的命名风格可以让读者阅读源码就像在阅读注释一样,根本不需要为代码额外写注释。
网友评论