性能优化
1.布局优化,尽量减少布局的层级,删除无用的控件和层级,选择性能较低的ViewGroup
。采用include
标签,merge
标签和ViewStub
。
include
标签用于布局重用,它只支持android:layout_
属性,id
除外(如果被引用的根布局有id
,依然以include
标签的id
为准),且要使用android:layout_
属性,必须指定android:layout_width
和android:layout_height
,否则其他无法生效。
merge
标签主要用来减少布局的层级,比如子布局的根布局跟父布局效果一样,那么子布局的根布局其实是不必要的,用merge
就可以去掉这个根布局。
ViewStub
的作用是按需加载布局,它本身不参与绘制测量过程,在代码中通过setVisibility(View.VISIBLE)
或inflate
方法加载后,它会被内部的布局替换掉。ViewStub
不支持merge
标签。
2.绘制优化,View
的OnDraw
方法不要执行大量的操作(创建新的局部对象或做耗时操作)。
3.内存泄漏优化,一是避免写内存泄漏的代码,二是通过分析工具找出潜在的内存泄漏并解决。常见的内存泄漏如下:
(1)静态变量导致的内存泄漏,常见的就是静态对象对Activity
的引用,导致Activity
无法正常销毁。
(2)单例模式导致的内存泄漏,常见的是向单例模式的对象注册持有Activity
引用的监听,但是没有解注册的操作,因为单例模式的生命周期跟Application
是一致的,所以Activity
无法及时释放。
(3)属性动画导致的内存泄漏,属性动画中的无限循环这一类需要在Activity
销毁的时候停止,否则属性动画持有View
,而View
又持有Activity
,导致Activity
无法释放。
4.响应速度优化,避免在主线程中做耗时操作。Activity
5秒无响应或BroadCastReceiver
10秒无响应,都会造成ANR
。通过traces
文件可以定位问题。
5.ListView
优化和Bitmap
优化,ListView
优化主要思路是:避免在getView
方法做耗时操作;避免快速滑动时引起的大量异步任务执行;开启硬件加速。Bitmap
优化则是图片压缩。
6.线程优化,线程优化的思想是采用线程池,避免程序中使用大量的Thread
。
7.优化建议:
避免创建过多对象。
不要过多使用枚举。
常量用static final修饰。
使用一些Android特有的数据结构。
适当使用软引用和弱引用。
采用内存缓存和磁盘缓存。
内部类尽量采用静态的。
8.提高代码的可读性,主要是命名规范,代码排版合理,关键地方才写注释。
9.代码要有层次感,遵循单一职责原则对代码逻辑进行分层。
10.合理采用设计模式,提高代码的可维护性和可拓展性。