安卓性能五大方面
- 布局
- hierarchyView查看measure,layout,draw方法的耗时
- 是否存在过度绘制:
比如Activity自带的那一层背景一般都不需要。在自己的AppTheme里面去除该背景色即可:
<style name="AppTheme" parent="android:Theme.Light.NoTitleBar">
<item name="android:windowBackground">@null</item>
</style>
或者在Activity的onCreate方法中:
getWindow().setBackgroundDrawable(null);
写布局需注意
尽量不要嵌套使用RelativeLayout.
尽量不要在嵌套的LinearLayout中都使用weight属性.
Layout的选择, 以尽量减少View树的层级为主.
去除不必要的父布局.
善用TextView的Drawable减少布局层级
如果H Viewer查看层级超过5层, 你就需要考虑优化下布局了~
ListView优化
contentView复用
引入holder来避免重复的findViewById.
分页加载
2、 内存
* 内存泄漏的几种情况:通过Analyze->Inspect code->选择检查的代码范围。
* 非静态内部类会持有Activity的引用,例如handler,thread,ansynctask。
* 用SparseArray代替HashMap可节省内存。(因为SparseArray的结构更简单)。
* 对于linearlayout布局要设置android:baselineAligned=”false”,可以加快layout的计算渲染速度。而且避免textview基线对齐导致的布局混乱。
* 在布局进行嵌套使用时,父布局与子布局都使用了android:layout_weight,但不是必须使用时,可去除子布局中非必须使用的android:layout_weight。
* 包含imageviwe和textview的linealayout采用textview的drawablexxx代替,提高效率。
* 无用的层级导致的渲染效率降低。
* widowbackground设置为nulll。
* 注册未取消造成的内存泄露
* 集合中对象没清理造成的内存泄露
*
*
* 频繁的申请内存对象和和释放对象,可以考虑Pool 池: 例如listview的RecycleBin,handler的Message.obtain.线程池。
3、 加载速度
traceview观察到application的oncreate方法的imageloader的初始化方法很占用cpu时间,后来将一些不需要在主线程执行的放进非UI线程中执行。再后来使用glide加载图片。
开辟单独的子线程来处理耗时事务.
降低非ui线程的优先级
Activity的所有生命周期回调 Service BroadcastReceiver的onReceive回调 没有使用子线程的looper的Handler的handleMessage, post(Runnable) AsyncTask的回调中除了doInBackground, 其他 View的post(Runnable)是执行在主线程的.
布局优化
过度绘制
- Activity的背景,即windowbackground。
- 不必要的background
- imageview的background
渲染效率
- textview的drawable
- linearlayout 设置基线对齐
减少绘制
- 利用viewstub减少
- 减少层级
- 减少relativelayout嵌套
- 减少linearlayout父布局与子布局都使用weight的情况。
- 重用view 比如listview
加载速度
traceview观察到application的oncreate方法的imageloader的初始化方法很占用cpu时间,后来将一些不需要在主线程执行的放进非UI线程中执行。再后来使用glide加载图片。开辟单独的子线程来处理耗时事务.
内存优化
频繁的申请内存对象和和释放对象,可以考虑Pool 池: 例如listview的RecycleBin,handler的Message.obtain.线程池。
- 用SparseArray代替HashMap可节省内存。
- *
bitmap 的优化
内存泄漏
非静态内部类会持有Activity的引用,例如handler,thread,ansynctask。
注册未取消造成的内存泄露
- 集合中对象没清理造成的内存泄露
- *