大多数开发者在没有发现严重性能问题之前是不会特别花精力去关注性能优化的,通常大家关注的都是功能是否实现。当性能问题真的出现的时候,请不要慌乱。我们通常采用下面三个步骤来解决性能问题。
·Gather:收集数据
我们可以通过Android SDK里面提供的诸多工具来收集CPU、GPU、内存、电量等性能数据。
·Insight:分析数据
通过上面的步骤,我们获取到了大量的数据,下一步就是分析这些数据。工具帮我们生成了很多可读性强的表格,我们需要事先了解如何查看表格的数据,每一项代表的含义,这样才能够快速定位问题。如果分析数据之后还是没有找到问题,那么就只能不停的重新收集数据,再进行分析,如此循环。
·Action:解决问题
定位到问题之后,我们需要采取行动来解决问题。解决问题之前一定要先有个计划,评估这个解决方案是否可行,是否能够及时的解决问题。
一般情况下,数据分析可以得到一些功能模块的速度达不到要求或者电量消耗过大,这种情况下就得加快速度与减少耗电量,至于加快速度与减少耗电量的具体方案的根据具体功能模块具体定。常见的需要提速的模块主要有网络请求,数据库操作等,解决办法包括使用cache,缓存,预加载,延迟获取,减少冗余数据等手段,当然也可以使用开源框架。对于提速相关优化,在其他文章中已经说得很多了,这里就说明写电量优化,如下就是一种电量优化方案
关于Batching下面使用一张图演示下Batching的原理(将单次的网络请求变成批量的,这样可以减少每次请求开启网络的电量损耗):
Service性能优化
Service是Android程序里面最常用的基础组件之一,但是使用Service很容易引起电量的过度消耗以及系统资源的未及时释放。学会在何时启用Service以及使用何种方式杀掉Service就显得十分有必要了。
简要过一下Service的特性:Service和UI没有关联,Service的创建,执行,销毁Service都是需要占用系统时间和内存的。另外Service是默认运行在UI线程的,这意味着Service可能会影响到系统的流畅度。
使用Service应该遵循下面的一些规则:
·避免错误的使用Service,例如我们不应该使用Service来监听某些事件的变化,不应该搞一个Service在后台对服务器不断的进行轮询(应该使用Google Cloud Messaging)
·如果已经事先知道Service里面的任务应该执行在后台线程(非默认的主线程)的时候,我们应该使用IntentService或者结合HanderThread,AsycnTask Loader实现的Service。
Android系统为我们提供了以下的一些异步相关的工具类
·GCM
·BroadcastReciever
·LocalBroadcastReciever
·WakefulBroadcastReciver
·HandlerThreads
·AsyncTaskLoaders
·IntentService
如果使用上面的诸多方案还是无法替代普通的Service,那么需要注意的就是如何正确的关闭Service。
·普通的Started Service,需要通过stopSelf()来停止Service
·另外一种Bound Service,会在其他组件都unBind之后自动关闭自己
把上面两种Service进行合并之后,我们可以得到如下图所示的
结语:最近一直在处理的Android App优化博客到现在已经暂时该一段落了,这段时间笔者从速度,内存,电量等方面说明了,优化方法,希望各位能再看我博客时有所得。