Android性能优化-代码优化
引言
APP的性能一直都是我们重点关注的对象,偶尔跟好几个同样做Android的朋友聊起来这件事,发现自己公司里面好多Android开发者根本都没有关注过这一点儿(这几年走培训出来的确实不少),尤其是公司新人。他们觉得只要能实现业务逻辑并且不出问题就行了,至于手机端安全软件报的高耗电、偶尔内存溢出、代码冗余、体量庞大的问题压根没有过多关注。可以理解,毕竟现在程序员也不好做了,拿着卖白菜的钱,天天干着卖白粉的活。而且加班加到怀疑人生,压根儿也没有时间去做这些。
不过,性能优化对于我们想做出一款优秀的APP来说还是挺重要的。如果把这些优化知识能深置自己写代码的潜意识中去,那就太好不过了。不仅能使自己开发的程序更牛逼提升自己的编码能力,甚至对你以后的职业生涯产生深远的影响。
编码准则
- 避免过多的内存分配
- 减少冗余的工作
- 了解语言特性和API
数据结构优化
在Java开发当中我们常用的数据结构有ArrayList,LinkedList,HashMap,HashSet等,这几个的区别及适用环境一定要搞清楚。回头有时间我针对这个再写一篇文章。今天要说的是HashMap,因为在Android当中有个SparseArray,它在Android中就相当于HashMap在Java中一样。SparseArray是Android平台中特有的稀疏数组的实现。在一些特定场合可以代替HashMap,这样可以提高性能。但是需要特别注意的是SparseArray并不是线程安全的,并且SparseArray中的数据是按照key值大小排列的,最后一定要知道,SparseArray的删除并不是立即删除的。
在SparseArray中有四种分类:
- SparseBooleanArray 相当于 HashMap<Integer,Boolean>
- SparseIntArray 相当于 HashMap<Integer,Integer>
- SparseLongArray 相当于 HashMap<Integer,Long>
- SparseArray<String> 相当于 HashMap<Integer,String>
那为什么SparseArray的数据是按照key值得大小排列呢?因为SparseArray的核心查询方法是用的二分查找,如果你没有顺序,也就没有办法使用二分查找了。下面我们看下SparseArray的核心查找算法:
static int binarySearch(int[] array,int size,int value){
int lo = 0;
int hi = size - 1;
while(lo <= hi){
final int mid = (lo + hi) >>> 1;
final int midVal = array[mid];
if(midVal < value){
lo = mid + 1;
}else if(midVal > value){
hi = mid -1;
}else{
return mid;//查询到结果
}
}
return ~lo;//查询不到
}
那么我们现在知道了怎么优化,但是还不知道到底要优化何处呢。毕竟一个项目有很多文件,如果当初开发者并不是自己,要是一个一个文件去找岂不是要找到地老天荒么?别着急,Google爸爸早就把这个问题考虑进去了。Android studio自带了一个代码审查工具Lint。有时间我会把这个Lint的使用详细出一片文章,敬请期待。这里我先告诉你怎么寻找要优化的HashMap位置。
首先,找到Analyze->Inspect Code…然后点进去。
然后,选择我们要审查的文件夹,在这里我只选择了APP目录下的所有文件。
其它设置我们暂且默认,最后点击OK
如果你项目比较大的话,应该会跑1分钟左右,项目小的话也就几秒。最后运行结束会在底部展示出来审查结果:
我们要改的HashMap提示是这样的:
HashMap Can be replaced with SparseArray
直接双击点进去,然后自己看着修改就OK了。
当然了,这仅仅是代码优化的冰山一小角。后面我们继续更新。更多内容请关注公众号“计算机自学平台”