android开发系列之性能优化

      好久没有去更新博客了,倒不是因为没有时间,而是因为自己这段时间有点迷茫、犯懒。好了,废话不多说,今天这篇博客我想要跟大家分享一些自己这段时间关注比较的一个方向,那就是android的性能优化。

      大家肯定都知道现在手机的配置也在不断的更新升级,有的配置甚至都已经到8G cpu了。那么是不是就意味着我们可以粗线条的滥用手机资源呢?不管是从用户角度看、还是从我们自己作为开发者角度看,我们都应该以一颗匠心去做好每一个activity/service,我们更应该以一颗匠心去用好每一个变量、每一个数据对象,因为正是这些细节之处才能提高自己的技术能力。下面的章节将会参考google的性能规范做一些整理,也算是对自己这段时间的一个总结吧!

      首先在UI Xml布局方面,我们都知道一个Activity布局越复杂,那么系统绘制的时候所要使用的时间就越长。当时间超过16ms的时候,那么就能明显的感觉到丢帧的情况。所以基于上面的原则,应该将一个页面做的越简单越好。比如可以使用view,或者viewstub等标签去拆分复杂的页面,同时ViewStub标签还能够做到延时加载,这样就可以做到更好的用户响应。在google规范里面,还有一条就是尽量少使用RelativeLayout面板,虽然在适配性方面它能够表现出很好的优势。但是底层绘制RelativeLayout的时候会有两次复制过程,也就意味着会有两次的内存分配过程。我们都知道过多的内存搅动肯定会带来内存的下降。同时,当我们在做页面布局的时候不要动不动就使用Activity,可能我们都习惯了多个页面之间采用Activity进行跳转,完成App逻辑的开发。但是细想一下,就会发现每个Activity都会带来一次页面绘制过程,所以应该尽可能使用Fragment进行局部页面的替换。

      然后就是页面代码的书写规范了,当我们在开发一款App的时候,都应该以最低配的手机、最差的网络作为对齐标准。当处于有限的Cpu条件下、不稳定的网络环境下,我们应该尽量去节约宝贵的手机资源。

   1.对于不是需要长时间服务的需要,尽量不用使用service,而是使用BroadCast,进行及时的通知就可以了。即使不得已要使service,也应该保证能够在不需要的时候,关闭它;
   2.尽量减少Gc的次数,避免Cpu搅动;
   3.尽量使用原始类型,避免使用类型对象。比如应该使用int类型,而不是Integer。因为每一次的类型对象,都涉及到内存分配过程;
   4.尽量使用经过优化的集合对象,比如ArrayMap/SimArrayMap/SparseArray,而不要使用HashMap。当我们在定义一个集合对象的时候,如果能够明确确定所要存储的大小,那么就应该明确固定大小,避免动态扩容带来的性能消耗;
   5.小数据量的存储应该尽量避免使用数据库,因为数据库的IO存储都很耗性能、耗时;
   6.小数据量的存储应该尽量避免序列化Parcelable,因为序列化会带来许多额外无用的信息;
   7.避免Binder传递大对象,因为Binder会涉及到数据的包装过程,可以使用内存变量代替;
   8.尽量不要在循环里面,进行内存分配的操作。也就是循环里面不要做数据存储、对象分配、变量创建等操作。基于上面的分析,建议采用for循环角标遍历;
   9.避免使用枚举类型,因为枚举类型底层都会涉及到包装、转化的过程。建议采用int变量代替;
   10.避免一个activity里面的静态变量存在循环引用,可能造成OOM;
   11.慎重第三方jar的直接引入,因为不但加大apk的大小,同时可能一些不可预知的错误。建议小部分源码引入;

      最后给大家留个悬念,这个问题自己之前也一直没有注意过。比如当需要一个Student对象的时候,A.定义一个方法完成Student对象的构造然后返回;B.将需要的Student对象通过参数传入,只是在当前方法里面进行相关的属性赋值。

原文地址:https://www.cnblogs.com/xiaocai20091687/p/xiaocai_android_15.html