Android性能优化常用方法

时间:2022-12-09 18:04:53


 

本篇博客主要介绍关于性能优化的一些方法,以及性能分析工具的使用。

 

 

一 性能优化的常用方法

主要内容包括布局优化,绘制优化,内存泄露优化,相应速度优化,ListView优化,Bitmap优化,线程优化,以及一些性能优化建议,在介绍相应速度优化的同时,还介绍了ANR的日志分析方法。

 

(1).布局优化

布局优化的思想很简单,就是尽量减少布局文件的层级。

如何进行优化呢?首先删除布局中无用的控件和层级,其次有选择地使用性能较低的ViewGroup,比如LinearLayout。如果布局中有的布局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,这是因为RelativeLayout比较复杂,他的布局过程花费更多的CPU时间。FrameLayoutLinearLayout一样都是一种简单高效的ViewGroup,因此可以考虑使用他们,但是很多时候,单纯的通过一个LinearLayout或者FrameLayout无法实现产品的效果,需要通过嵌套的方式来完成,这种情况建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。

 布局优化的另一种手段是采用<include>标枪,<merge>标签和ViewStub<include>标签主要用于布局重用,<merge>标签一般和<include>配合使用,它可以减少布局的层级。而ViewStub则提供了按需加载功能,当需要时才将ViewStub中的布局加载到内存,这提高了程序的初始化效率。

 

(2).绘制方法

绘制优化是指ViewonDraw方法避免执行大量的操作,这主要有两方面。

首先,onDraw中不要创建新的布局对象,这是因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁的gc,降低了程序的执行效率。

另一方面,onDraw方法中不要做耗时的任务,也不能执行成千上万次循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。

 

(3).内存泄露优化

内存泄露在开发过程中是一个需要重视的问题,但是由于内存泄露问题对开发人员的经验和开发意识要求比较高,因此这是开发人员最容易犯的错误之一。内存泄露的优化分为两个方面,一方面是在开发过程中避免写出内存泄露的代码,另一方面通过一些分析工具比如MAT来找出潜在的内存泄露继而解决。

常见的内存泄露举例:

1.静态变量导致内存泄露

如果我们将activitycontext对象赋值给activity的全局的静态变量。那么就会造成activity无法正常销毁,因为静态变量在引用它。

2.单例模式导致的内存泄漏

如果我们再单例模式中实现了观察者模式,监听实现了接口的对象,当我们在Activity中注册了监听方法以后,而没有进行解注册,就会引起内存泄漏。

3.属性动画导致的内存泄露

属性动画中有一类无限循环的动画,如果在Activity中播放此类动画而没有在onDestory中停止动画,那么动画会一直播放下去,尽管无法在界面上看到动画效果了,而且这个时候,ActivityView会被动画持有,而View有持有了Activity,最终导致Activity无法释放。

 

(4).响应速度优化和ANR日志分析

相应速度优化的核心是避免在主线程中做耗时操作,但是有时候的确有很多耗时操作怎么办?可以将这些好事操作放在线程中去执行,即采用一部的方式去执行。相应速度过慢地体现在Activity的启动画面上,如果在主线程中做太多的事情,会导致Activity启动时出现黑屏的现象,甚至出现ANR。当发生了ANR以后。系统会在/data/anr目录创建一个文件traces.txt,通过分析这个文件,就可以定位ANR的原因。

(5).ListViewBitmap优化

ListView的优化很简单,主要分为三个方面:首先采用ViewHolder并避免在getView中执行耗时操作;其次要根据列表的滑动状态来控制任务的执行频率,比如当列表快速滑动时显然是不太适合开启大量的一部任务;最后,可以尝试开启硬件加速来使ListView的滑动更加流畅。

 

 

Bitmap优化同样比较简单,主要通过BitMapFactory.Options来根据需要对图片进行采样,采样过程主要用到了BitmapFactory.OptionsinSampleSize参数。

 

(6). 线程优化

线程优化的思想是采用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销。同时线程池还能有效的控制线程池的最大并发数,避免大量的线程互相抢占系统资源从而导致阻塞现象发生。

 

(7).关于性能优化的建议

1.避免黄健过多对象;

2.不要过多使用枚举,枚举占用的内存空间比整型大一些。

3.常量使用static final 来修饰。

4.使用一些Android特有的数据结构,比如SpareArrayPair等,他们都具有更好的性能。

5.适当使用软引用和弱引用。

6.采用内存缓存和磁盘缓存

7.尽量采用静态内部类,这样可以避免潜在的内部类而导致的内存泄漏。

 

 

二 内存泄露分析之MAT工具

MAT的全称是Eclipse Memory Analyzer,它是一款强大的内存泄漏分析工具,关于这部分,我不详述了,请自行查找相关文章。

 

 

 

写了十多篇博客了,以后还该写什么,怎么写,还在考虑,更新进度可能会慢一些。。。