Android性能优化总结

时间:2021-12-21 13:38:55

一.App启动优化
1.必要的初始化要放到application中
2.不是立马需要的且需要的时间较长的最好放到子线程中初始化,减少主线程执行的时间,加快app的启动
3.即使将一些不是必要的操作放到子线程,虽然能提供启动速度,但是当你点击app启动的时候也还是会出现白屏等待的现象,为了解决这个问题我们只需要给第一个启动的activity自定义一个theme即可,将theme的windowBackground设置为需要的图片即可.参考

http://blog.csdn.net/totcw/article/details/52218271

4.为什么要将必要的初始化放到application中是因为很多情况下,进入我们的某一个界面是不会从欢迎页面进入的,如果你将必要的初始化放在欢迎页面就会有问题.比如一下几种情况
1、App切回后台,内存不足导致Application被回收,从最近任务列表中恢复界面时Application需重新创建
2、应用没挂起时,Push推送需从Notification跳入应用内某界面
3、应用没挂起时,浏览器外链需跳入应用内某界面

二.布局优化
布局优化就是尽量的减少布局的层级,避免过度绘制,这样Android绘制的工作量就减少了,程序的性能就提升了.
1.尽量使用性能较低的viewgroup,linearlayout优于relativelayout
2.使用merge标签可以解决相同布局嵌套导致的过渡绘制问题
3.使用ViewStub标签可以解决动态加载页面布局,避免默认加载不必要布局的问题;
4.Space标签可以解决只占位、不刷新的视图问题
5.去掉Window背景可以解决所有界面的过渡绘制问题
6.不必要的alpha值设置可以解决同一视图被多次绘制的问题;

布局优化的工具使用:
1.使用Hierachy View可以查看到布局层级树,同时可以查看到draw,layout,measure所使用的时间,就可以有针对性的优化.在这3个方法中不要执行大量的操作,比如创建对象,执行循环,做耗时操作等.因为这3个方法在绘制的时候都是可能执行多遍的.
2.打开手机的开发者选项中的调试GPU过渡绘制,可以看到布局过度绘制的 情况.Android通过不同颜色来区分同一个区域绘制的次数,颜色越深,表示过渡绘制的次数越多,过渡绘制越严重,蓝色表示存在一次过渡绘制;深红色表示同一区域存在4次及以上的过渡绘制.
三 响应速度优化
响应速度优化的核心思想就是避免在主线程做耗时操作.android之所以会出现ANR就是因为在主线程做耗时操作超过了系统规定的时间.为了避免在主线程做耗时的操作就要采用子线程.
说到子线程就同时要注意线程的优化,为了避免程序中存在大量的Thread,一般是采用线程池,因为线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能的开销,同时线程池还能有效地控制线程池的最大并发数量,避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生.

响应速度优化的工具使用:
1.strictMode 一般用来检测主线程中的耗时和阻塞操作.使用也很方便一般在oncreate中 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build());

        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
.penaltyLog()
.build());

调用以上代码就可以了.使用了penaltylog()在将信息打印在logcat中.

2.traceView 用来展示和分析方法的执行时间.

四 内存泄漏优化
内存泄漏的优化分两个方面,一方面是在开发过程中避免写出有内存泄漏的代码,另外一方面是用分析工具比如mat和leackcanary来分析内存泄漏.
开发过程中容易造成内存泄漏的原因如下:
1,尽量少使用static
2.及时且主动将不需要的引用指定为null,集合最好clear这样即使这个集合内存泄漏了至少里面的数据没了
3,内部子线程持有该类的引用,因为非静态内部类持有一个外部类的引用
4.擅用handler,因为也是一个匿名内部类也持有activity的引用,如果在activity结束了还有消息在处理就会造成activity的内存泄漏,所以一般在ondestroy方法中调用handler.removeCallbacksAndMessages(null)取消所有的消息处理.或者直接将handler声明为static的
5.流,访问网络,数据库等都要即使关闭资源
6.在代码中绑定了服务和广播时,在ondestroy方法中一定要记得解绑
7.当有较多的字符串需要拼接时,尽量使用StringBuffer
8.如果为了满足需求下必须使用Context的话:Context尽量使用Application Context,因为Application的Context的生命周期比较长,引用它不会出现内存泄露的问题(比如自定义的shapeDialog里面有context,我们在oncreate里面创建了dialog,如果在ondestry中不将dialog设置为null,那么dialog不会清除,就会一直引用这context,那么这个activity也不会被清楚)
9..如果不是用框架加载图片,只是用Bitmapfactory加载本地图片时,一定要利用Options压缩图片,尽量用软引用来定义Bitmap对象且使用完要调用recyle方法回收.
10.单例模式也容易造成内存泄漏
五 其他方面的优化
比如listview的优化和bitmap优化防止oom等.