热文导读
点击标题阅读
[推荐]AndroidStudio下对资源进行分包,很实用
吊炸天!74款APP完整源码!
Android高仿懂球帝我是教练效果
前几篇文章详细讨论了Android中性能优化的问题。本篇文章是对前面部分的一个总结(读者可以翻看之前的文章),同时笔者结合了实际项目中的经验,希望能对大家抛砖引玉。
Android性能优化,也是面试中几乎必问的知识点。本文也将告诉你如何回答这样的问题。
实际项目中的Android性能优化主要有如下几个方面:
编写高效代码—开发中总结出的一些小的性能Tips
Layout布局优化
内存优化
编写高效代码本节告诉你如何编写高效代码,并总结了一些小的性能优化点。
编写高效代码的两个原则
不要写不需要的代码
不要分配不必要的内存
以上两个原则,似乎感觉是废话,但确实是编程的最高境界,也是我们编写代码的过程中时刻需要思考和注意的两个方面。
那么如何做到如上两点呢?下面列出了一些实际开发中的小的例子。
1.避免产生不必要的对象例如:
int的数组比Integer对象数组要好得多。两个平行的int数组要比一个(int,int)型的对象数组高效。这对于其他任何基本数据类型的组合都通用
两个平行数组Foo[],Bar[]会优于一个(Foo,Bar)对象的数组
通常来讲,尽量避免创建短时零时对象.少的对象创建意味着低频的垃圾回收
对象的分配和回收都是需要代价的;分配的内存越多,就会引起强制的内存回收;给用户体验增加小的停顿间隙,从而影响用户体验。
用户能感觉到卡顿的时间延迟是ms~ms。
2.用静态代替虚拟如果方法不需要访问某对像的字段,将该方法设置为静态,调用速度会提升15%~20%
对于常量使用finalstatic
finalstaticintintVal=42;finalstaticStringstrVal="Helloworld";
注:这种优化仅仅是针对基本数据类型和String类型常量的,而非任意的引用类型。但尽可能的将常量声明为staticfinal是一种好的做法。
为什么尽量将将常量声明为staticfinal是一种好的做法呢?这是因为:
当上面的代码块没有final修饰符时,编译器会生成一个类初始化方法,当该类初次被使用时执行,这个方法将42存入intVal中,并得到类文件字符串常量strVal的一个引用。当这些值在后面被引用时,他们通过字段查找进行访问。
声明为final字段后,类不再需要方法,因为常量通过静态字段初始化器载进入dex文件中。引用intVal的代码,将直接调用整型值42;而访问strVal,也会采用相对开销较小的“字符串常量”指令替代字段查找。
本节讨论的是一些微小的性能提升,可能不会给你的程序性能改善产生显著的效果。决定程序整体性能的仍然取决于程序的业务逻辑设计、代码的数据结构和算法。但你需要将这些优化技巧应用到平时的编码过程中,积少成多,也会对性能有很大的影响
3.避免内部的getter和setter4.使用增强for循环对于ArrayList和数组,手写的计数循环迭代要比增强for循环快3倍
结论:优先采用改进for循环,但在性能要求苛刻的ArrayList迭代中,考虑采用手写计数循环。(参见EffectiveJavaitem46.)
5.避免使用浮点数通常的经验是,在Android设备中,浮点数会比整型慢两倍
6.在没有JIT的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更高效voidmethodA(ListStringlist);voidmethodA(ArrayListStringlist);
如上,后一种比前一种更高效。
7.数据库操作方法的优化尽量利用原生的SQL语句
原生的SQL省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert、query、update、delete等函数效率高。当数据库越大,差别也越大
当操作条数较多时,利用事务进行批处理
这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高
db.beginTransaction();for(Collectionc:colls){insert(db,c);}db.setTransactionSuccessful();
8.Http请求方式的选择Android内置了两种HTTP方式:HttpURLConnection和ApacheHttpClient。这两种都支持HTTPS、流式上传和下载、可配置超时、IPv6和连接池。在Gingerbread或者更高版本时,推荐使用HttpURLConnection。
这是因为:HttpURLConnectionAPI更简单,包更小。同时对传输数据的压缩和响应的缓存处理减少了网络带宽、提高了速度,也节省了电量。
优化布局Layouts是Android应用里直接影响用户体验的一个关键部分。如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢。AndroidSDK提供了工具帮助你分析你的Layouts的性能问题。结合工具同时遵循本节讨论的做法,能实现滑动流畅、占用内存最小的用户界面。
使用HierarchyViewerHierarchyViewer工具位于SDK\tools\目录下,该工具能分析出你的布局不合理和可以优化的地方。具体用法参见之前文章的介绍例子。
大多数情况下,布局渲染时间差别较大的原因是在LinaerLayout里使用了layout_weight。这将会增加测量(Measure)的时间。你应该仔细的考虑是否有必要使用layoutweight。
使用Lint使用Lint—查看你的view层级哪些地方可以优化