android艺术开发探索之性能优化
最近看这本书,本人习惯性看完书后划横线划重点,这得归功于在大学的时候,我读了自考,当时的概念就是给你一本书,你的考及格,有个老师上课专门给你讲重点,划线,下课后背,查,因此就养成了这种习惯,就这么样了,不扯淡了,下面继续,以下是知识点:
- 布局优化
- 绘制优化
- 内存泄漏优化(单例导致)
- ANR
布局优化
- 删除布局中无用的控件和层级,减少嵌套,在达到目的的情况下减少控件和层级.
- - 有选择性的使用性能较低的viewgroup,FrameLayout和Linearlayout的性能比RelativeLayout的性能好,但是当需要嵌套对个linearlayout才能实现一个relativelayout的布局时就选择relativelayout,需要嵌套还不如relativelayout.
- 采用include标签达到布局重用,merge标签用来减少布局层级,viewstub用来按需加载布局(比如:无网是一个布局,有网又是另外一个布局).
include标签重点:
include只支持android_layout开头的和android:id属性,其他不支持,include里面的id优先级大于它包含的内容的优先级,也就是相同的id以include的android:id为基准。
设置include的宽高属性时必须同时存在,否则其他的android:layout_*属性无法生效
merge标签重点:
当前布局根布局是某控件(如linearlayout),当前布局的include包含的布局的根布局也是某控件,则把当前布局包含的include所对应的布局的根布局换成merge标签减少层级。
viewStub标签重点:
viewstub用于一个activity中有多个布局的时候,比如有网的时候显示一个布局,没网的时候又显示另外一个布局等,这个时候用viewstub来优化,用法和include相似:
<ViewStub
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/自己的id"
android:inflatedId="@+id/刚开始隐藏的布局的根元素的id"
android:layout="@layout/隐藏布局的文件名"
/>
当它要显示的时候直接findbyid并且setvisible就好了。
绘制优化
- View的onDraw方法不要执行大量操作(不要创建新的局部对象,占内存)
- View的onDraw方法不要执行耗时操作,也不要执行成千上万的循环(循环抢占cpu时间片,绘制卡顿)
内存泄漏(可使用Mat工具检测)
- 把context设置成静态的activity将无法销毁,context引用了this–>activity
- 吧view设置成静态的,new view(this)时会将actiivty无法释放因为view静态并持有它。
- activity的对象被单列模式的某某所持有时。单例模式的生命周期和application一致,会导致activity无法被及时释放
- 无线循环的属性动画如果未在Ondestroy中掉animator.cancle去停止,该动画会一直播放,view持有了动画和activity,最终activity无法释放
线程优化
- 采用线程池,避免大量的thread.
图片优化
- 通过 BitmapFactory.Options采样压缩.
优化建议
- 避免创造更多的对象、
- 不要过多使用枚举,占空间比整形大
- 常量使用static final修饰
- 使用android特有的SparseArray和Pair等他们有较好的性能
- 适当使用软引用和弱引用
- 采用内存缓存和磁盘缓存
- 尽量采用静态内部类,这样可以避免潜在由于内部类而导致的内存泄漏
ANR
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)。 —— [百度百科 ]
actiivty5秒内无反应和boardcastreceiver10秒内未执行会出现anr,当发生anr的时候去系统/data/anr目录下找traces.txt查看分析异常。
爱分享爱开发的宝宝们可以加入群:234456543