1. 为何须要性能优化?数据库
上面说到,在时间窗口期内开发出产品是极端重要的,可是虽然基本功能咱们实现了,可是开发出来的产品代码运行的效率怎么样呢?咱们的App用户给用户的体验如何呢?缓存
咱们的App在低端机上常常ANR、闪退、卡顿等安全
咱们的App在其余分辨率上显示惨不忍睹?性能优化
咱们的App在不一样网络的状况下如何处理的?服务器
咱们的App体验如此之差,致使大量的用户流失。这些迫使咱们认识到性能优化是很是重要,某种程度上甚至超过了新功能的开发。网络
2性能优化四个方面:框架
- 响应时间(Response Time)dom
- 界面卡顿(ANR)异步
- 耗内存(Memory)工具
- 内存泄露(Out of memory)
响应时间
1)HTTP请求方式
这里指的是客户端与服务端交互,拿到数据、解析、再到显示到界面整个过程耗费的时间。
这个部分涉及客户端的优化,也涉及服务端的优化,这里只讨论客户端。
使用优秀的开源Http框架是咱们比较好的选择,它的优势是通过市场的验证. 加快响应速度(网络请求框架)。
2)数据解析
实际开发当中服务端的返回数据格式无非就两种:
- JSON
- XML
在Android中都可以使用优秀的解析库来加快咱们的解析速度,XML中有dom4j,JSON有Jackson、Gson,咱们经过这些库实现咱们更快的完成数据解析,提升咱们的开发效率。
3)数据存储
为了提升应用程序的响应时间,数据缓存是一个比较好的方式,咱们能够预处理服务器返回的数据,对数据进行缓存刷新。
优化点:
- 异步请求网络数据
- 预处理服务器返回数据
- 异步进行数据存储操做
- 数据缓存刷新
- Timeout超时重试
- 在主线程中操做UI
界面卡顿
ANR表示”应用程序无响应”,这个是须要咱们避免发生的事情,出现这个异常的缘由:
- 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
- BroadcastReceiver在10秒内没有执行完毕
致使ANR的缘由有不少,通常状况就是在UI线程作了耗时的操做,例如”网络请求”、数据库操做。
那么如何避免?
- UI线程只作界面刷新,不作任何耗时操做,耗时操做放在子线程来作
- 可使用Thread+handle或者AsyncTask来进行逻辑处理
耗内存
每部手机的内存有限,咱们这里所说的内存指的是手机的RAM,它是Ramdom Access Memory的缩写,咱们应用程序的须要随机读写的数据就存在RAM中,Android手机之因此会比较耗内存,这跟Android后台的处理有关,咱们知道Android应用是使用Java开发的,运行Java须要有虚拟机,说明每开启一个应用都会建立一个虚拟机,而这是须要内存的,因此咱们开的应用越多,后台进程越多,内存都分配出去了,才致使内存消耗的严重。
随机存取存储器(random access memory,RAM)又称做"随机存储器",是与CPU直接交换数据的内部存储器,也叫主存(内存)。它能够随时读写,并且速度很快,一般做为操做系统或其余正在运行中的程序的临时数据存储媒介。
其实这个问题咱们是没得破的,只要内存不够,咱们的应用仍是会卡。咱们开发的应用依赖与系统给咱们分配的堆内存,通常上限在16M~48M,但咱们能够经过在AndroidManifest设置Application属性largeHeap=“true”来申请更多的堆内存。
能够经过代码获取可用堆内存限制
内存泄露
内存泄露这个问题已经被说烂了,你们都知道有内存泄露这个问题存在,但为何会发生内存泄露?
这里的内存泄露并非真正意思上的泄露,而是由于内存不足不能进行GC操做,从而致使占用内存过大,抛出out of memory异常,而被系统Kill掉。(内存泄露进而致使内存溢出)
3,如何进行性能优化?
前面讲了一些背景知识,对咱们理解内存优化有必定的帮助,下面就简单说一下咱们优化的方向:
- 布局优化
- 内存优化
布局优化
优化点:
- 避免OverDraw
- 优化布局层级
- 避免过多无用嵌套
- 使用标签 重用layout
- 使用延迟加载
- Hierarchy View进行层级分析
内存优化
内存优化的点有不少,这里我主要分为两大块:
- Bitmap优化
- 代码优化
代码优化
关于代码这个就有的说了,任何能改进咱们程序的优化点都能写在这里,这里没办法把全部优化的点列在这里,只提供相关的参考,剩下的就好各位经验总结和积累了。
优化点:
- 对常量使用static修饰符
- 使用静态方法
- 减小没必要要的成员变量
- 尽可能不要使用枚举,少用迭代器
- 对Cursor、Receiver、Sensor、File等对象,要注意它们的建立、回收与注册、反注册
- 避免大量使用注解、反射
- 使用RenderScript、OpenGL来进行复杂的绘图操做
- 使用SurfaceView来替代View进行大量、频繁的绘图操做
- 尽可能使用视图缓存,而不是每次都执行inflate()方法解析视图
建立新的对象都须要额外的内存空间,要尽可能减小建立新的对象。 将类、变量、方法等等的可见性修改成最小。 针对字符串的拼接,使用StringBuffer替代String。 不要在循环当中声明临时变量,不要在循环中捕获异常。 若是对于线程安全没有要求,尽可能使用线程不安全的集合对象。 使用集合对象,若是事先知道其大小,则能够在构造方法中设置初始大小。 文件读取操做须要使用缓存类,及时关闭文件。 慎用异常,使用异常会致使性能下降。 若是程序会频繁建立线程,则能够考虑使用线程池。
以上都是些经验总结,大体都相差无几,朋友们在作代码优化的时候,能够根据这些优化点,有针对性去重构代码,其实最重要仍是代码的可读性,结构清晰。
性能优化工具
Memory Monitor - 内存监视工具 TraceView MAT
Android开发者对与以上几个性能调优的工具必定不陌生,这里我也再也不写那么多废话了,关于它们的使用方法,官网还有一些大牛的博客都有介绍。
写这篇文章的出发点也是对Android性能优化有个比较清楚的认识,任何事情都不可能一蹴而就,须要循循渐进,对一个初学者你谈优化很不现实,咱们先把基本的作好,再去考虑相应的优化,笔者也在不断学习当中,借鉴别人好的优化方案,提升产品的质量,感谢你们对笔者的关注。
性能优化技术,简而言之,就是提升咱们程序的性能,让咱们的应用更快,更少使用CPU资源,更少使用内存。
性能优化,一方面须要自身能力的提升,另一方面,也须要有意识去学习优化技术,并应用于自身项目的开发中。