Android编程开发之性能优化
性能优化是很大的学问,不比frame work层内核层简单多少,这里仅仅列出常见的
代码
位运算
?
布局
1层最好
include+merge(比如同方向LinearLayout,可以用merge)
view stub(需要指定一个inflatedId),inflate和设置visible都可以
?
绘制
onDraw避免大量操作,也避免耗时操作,因为onDraw会被频繁调用(有局部刷新的办法吗)
?
滑动控件
使用小细节,如recycler view数据集变化部分更新
滑动时停止网络请求
少用wrap_content,固定宽高居中最好
?
图片
压缩+3重cache(好好学习Glide最好)
?
内存泄漏
静态
单例(和Application同生命周期)不解绑
属性动画.cancel(动画持有view,view持有context)
匿名内部类
非静态内部类
?
线程池优化
Pair
SparseArray系列
多采用软弱引用
采用缓存
界面不可见释放内存
1.? @Override??
2.? public?void?onTrimMemory(int?level)?{??
3.? ????super.onTrimMemory(level);??
4.? ????switch?(level)?{??
5.? ????case?TRIM_MEMORY_UI_HIDDEN:??
6.? ????????//?进行资源释放操作??
7.? ????????break;??
8.? ????}??
9.? }??
TRIM_MEMORY_RUNNING_MODERATE内存已经有点低了,系统会根据LRU来杀进程了
TRIM_MEMORY_RUNNING_LOW内存已经非常低了,释放部分不必要的东西
TRIM_MEMORY_RUNNING_CRITICAL已经根据LRU杀掉大部分缓存进程了,所有不必要的都应该释放
如果这个程序是缓存的:
TRIM_MEMORY_BACKGROUND
TRIM_MEMORY_MODERATE
TRIM_MEMORY_COMPLETE
少使用枚举
减少类(500B)和对象(12-16B);少创建临时对象,可以避免频繁GC
谨慎抽象
谨慎注解
ProGuard混淆、压缩、优化代码
谨慎开启第二个进程,如音乐播放器
1.?
2.? ?????????android:process=":background"?/>??
在网络频繁请求的应用中,维护一个全局网络请求者实例,如Retrofit。
用StringBuffer或StringBuilder拼接String而不是+号,如果方法返回值是String,而且明确他会拼接,返回一个StringBuffer是一个不错的选择
当不需要下标的时候,采用增强for循环,array list不要用增强for循环
采用原生API,考验对原生API的了解程度,大部分情况,都比自己临时写的快
getter/setter、Book.bookName后者要快3-7倍,前者更符合OOP,孰优孰劣?