为什么别人的app那么的流畅、稳定?为什么我们的app在底端机上常常卡顿或者是更惨的OOM、闪退?
答案是:2016体验才是王道,所以我们不能再一味的追求进度与新功能了而忘记了性能!!!
一、内存优化
做内存优化我们首先就得明白什么是内存溢出、什么是内存泄漏。
内存溢出:简单是说就是运行需要的内存超出了机器提供的内存,系统为了保证正常运行不得不强行关闭软件来释放内存。
内存泄漏:通俗的说就是该被回收的对象还被其他的对象引用着,导致GC时没有被回收掉,这样随着应用的运行时间越长,他们就一直占着内存内存越来越大也就导致了程序崩溃。
那么问题来了,我们在实际开发中应该怎么做呢?
1、避免无效的对象、变量,减少内存的使用;
2、单例是使用也是对内存控制的很好实现;
3、严格按照Google的注册与反注册原理来,对Receiver、Sensor、File、Cursor(注意:Cursor的管理,看情况使用,Cursor的开启十分的耗时,可以通过Cursor.require来刷新
)、Stream的开关进行操作;
4、特别注意Context的使用,尽量使用ApplicationContext来避免内存溢出;
5、如果出现内存泄漏我们可以使用暴力而简单的工具来解决,推荐一篇文章 LeakCanary:让内存泄漏无所遁形;
6、Bitmap使用:
a、加载相应的图片,缩略图和大图分开,这很重要;
b、使用BitmapFactory.Options设置inSampleSize就可以缩小图片(Options.inJustDecodeBounds=true可以在不把图片读入内存的同时获得图片的尺寸,在通过inSampleSize来获取需要的大小);
c、缓存机制,这个就需要很深的功底了,推荐使用开源框架如:Picasso、Universal-ImageLoader、Fresco,这些都对图片做了很好的优化,相信大家一定不陌生;
二、布局优化
核心思想:减少布局的绘画时间。
1、ViewGroup选择;
能用LinearLayout的就别用RelativeLayout,虽然RelativeLayout很强大,不过它付出了性能的代价;
2、include、merge、viewstub的使用;
可能刚开始接触Android的小伙伴很少使用这三个家伙,不过他们真的很不错,include布局重用、merge降低层级关系、viewstub按需加载,这些百度一下一大堆的;
3、绘制优化;
为了保持界面的流畅性,那么我们就得有流畅的帧率,Android索性就把达到这种流畅的帧率规定为60fps(1000/60 = 16.67ms/帧), 所以在16ms内没有把这一帧的任务完成,就会出现丢帧的情况,尽量保证每次在16ms内处理完所有的CPU与GPU计算、绘制、渲染等操作,否则会造成丢帧卡顿问题。为了避免出现卡顿我们需要做的是:
a、不要在View的onDraw方法中进行耗时的逻辑;
b、减少不必的局部对象以及图片和背景,防止内存抖动造成的卡顿;
三、网络优化
1、网络请求方式;
GET:应当用来请求返回结果,参数是作为url的一部分;
POST:用于请求会更改服务端数据或状态;
HEAD:与服务器约定只需要返回头信息;
PUT:用于将网页放置正确的地方;
DELETE请求用于删除服务器指定文档;
网络操作是十分的复杂,自己开发费时费力还不一定好用,还是推荐使用开源的一些项目:okhttp、xUtils、Volley等;
2、数据解析;
JSON:通常我们会使用GJSON、Jackson;
XML:常用的有三种DOM、SAX、PULL(推荐使用后面两种,详情移步:
XML总结);
四、一些Tips
1、将Activity的Window背景设置为空。getWindow().setBackGroundDrawable(null);
2、文件操作的速度比数据库快10倍(针对存储文件大小与文件存储page分配大小相近时,如一张图片的存储);
3、如果方法用不到成员变量,那么把写成static,性能会提高很多;
4、慎用浮点数,它很慢;
5、尽量避免使用枚举;
6、少用setter/getter虽然他很方便,但是在当前类中使用public会好很多;
7、常量应该使用static final;
8、能用增强for循环就用,但是记住,它的方法内不能对集合本事操作;
9、listview是优化:
a、背景色与cacheColorHint设置相同,绘制时更快;
b、viewHolder使用,不好RecycleView已经强制使用了;
c、尽量减少item布局的层级;
d、减速没有必要的加载(按需加载);
友情提醒:以上为个人观点,仅供参考!