Android开发性能优化浅论之一

Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航等。由此必须对我们的应用程序进行各方面的优化,因此程序能否运行的快速而高效,这在资源有限的移动终端设备上尤其显得重要。因为即使目前最强大的移动终端的计算能力也无法和PC机器相媲美。在日常开发中,有两个原则是必须要考虑的:分别是

不做不必要的事情和不分配不必要的内存。

虽然Android系统本身已经针对UI、框架、运行平台等做了优化,但是对于开发人员而言,要设计一个高效的程序,依然需要在实际设计开发过程中,个人总结了部分原则如下,其中有些是个人通过网络学习研究总结的,感谢这些文章的作者。

 

首先要注意尽量避免创建不必要的对象

对象创建永远不会是免费的。每个线程的分代GC给零时对象分配一个地址池以降低分配开销,但往往内存分配比不分配需要的代价大。

如果在用户界面周期内分配对象,就会强制一个周期性的垃圾回收,给用户体验增加小小的停顿间隙。Gingerbread中提到的并发回收也许有用,但不必要的工作应当被避免的。

因此,应该避免不必要的对象创建。

如果有一个返回String的方法,并且他的返回值常常附加在一个StringBuffer上,改变声明和实现,让函数直接在其后面附加,而非创建一个短暂存在的零时变量。

对于字符串操作而言如果需要连加这样的操作建议使用StringBuilder,如果字符串每次连加,使用String需要的内存开销会远大于StringBuilder,然后Android手机常规的运行内存大约在128MB左右,对于运行多任务就需要考虑了,因为Java有GC不需要手动释放那么分配的时候就要格外的小心,频繁的GC操作仍然是很影响性能的。

 

图片使用注意:
android 中用bitmap 时很容易内存溢出,报内存溢出的错误

主要是加上这段:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;

 

尽量使用静态方法

如果不需要访问某对象的字段,将方法设置为静态,性能会有大幅提升,因为不需要再使用的时候再去创建这个对象。

 

异步任务与多线程

大家都知道,要设计一个交互体验好的程序,必须要保持一个轻量级的UI线程,以随时响应用户的操作。

比如:UI界面加载数据的时候,如果有大量的数据计算时,有两种方式可以保持UI线程的轻量级。

第一种是通过新建一个线程,通过在线程线程获取数据进行响应的计算等,然后通过handler机制更新UI线程。

第二种就是Android提供了AsyncTask方式,通过异步调用进行后台数据的计算,然后执行

onPostExecute()方法进行UI线程更新

需要记住的是,第一种适合数据量较大,并且不频繁更新UI线程的状况,须知Android系统创建并管理线程也需要很大的时间和空间的开销。

第二种方式更适合小数据量频繁更新UI的状况,这个就是Android特地为此状况提供的类库。

 

对常量使用Static Final修饰符

考虑下面类首的声明:

                       

编译器会生成一个类初始化方法,当该类初次被使用时执行,这个方法将42存入intVal中,并得到类文件字符串常量strVal的一个引用。当这些值在后面被引用时,他们通过字段查找进行访问。

我们改进实现,采用 final关键字:

 

类不再需要方法,因为常量通过静态字段初始化器进入dex文件中。引用intVal的代码,将直接调用整形值42;而访问strVal,也会采用相对开销较小的“字符串常量”(原文:“sring constant”)指令替代字段查找。

 

 

合理利用本地方法

使用本地代码的原因是因为部署到含有本地代码库的Android平台中,本地代码可以大幅度提升运行的速度,这个大家肯定都是知道的。

当然,本地方法并不是一定比Java高效。最起码,Java和native之间过渡的关联是有消耗的,而JIT并不能对此进行优化。当你分配本地资源时(本地堆上的内存,文件说明符等),往往很难实时的回收这些资源。 只有部署到平台中,本地代码才能发挥重要,而并非为了Java应用程序的提速。

 

少用浮点数

在Android设备中,浮点数会比整型慢两倍,这个细节也是实际开发过程中需要尽量注意的,在PC机器中,可以不太需要进行考量。

 

posted @ 2013-03-09 17:15  有想法的IT民工  阅读(...)  评论(...编辑  收藏