Android 性能优化
问题: 内存溢出(内存),卡顿或ANR(CPU)
布局优化
首先 删除布局中无用的控件和层级,有选择的使用性能低的ViewGroup,如LinearLayout.
性能 :布局层级少性能好,
CPU 花费时间比较:Framelayout = LinearLayout < RelativeLayout
其次 ,通过采用 < include> 标签,< merge >标签和 ViewStub
< include > 用于布局重用
< merge > 一般和< include > 搭配使用,减少布局的层级
ViewStub 提供按需加载的功能绘制优化
指- View 的 onDraw 方法避免大量操作
a. onDraw 不要创建新的局部对象,因为 onDraw 会被频繁调用,产生大量临时对象,占用内存,导致频繁gc降低效率
b. onDraw 方法不要做耗时操作,也不能执行成千上万的循环操作。因为大量的循环抢占CPU的时间片,造成view绘制不流畅。添加log监控时间 :
在函数开始 :long time = System.nanoTime();
在函数结尾:log.info(“TasteTime:” + (System.nanoTime() - time));内存泄漏优化
内存泄漏-申请的内存不能及时释放,memory leak
场景一:静态变量引用导致的内存泄露
public class MainActivity extends Activity {
public static Context sContext;
protected void onCreate (Bundle saveInstanceState) {
super.oncreate(saveInstanceState);
sContext = this;
}
}
原因:Activity由于被静态变量sContext引用,无法正常销毁。静态变量随着类的加载而存在,随着类的消失而消失,不会被GC回收。
解决方法:不要设置成 静态的变量
场景二:单例模式导致内存泄漏
单例模式的 TestManager 中可以接收外部注册并将外部的监听器存储起来,有注册函数 ,还有解注册函数。
Activity 向 TestManager 注册监听,由于缺少解注册的操作引起内存泄露。
原因: Activity 的对象被单例模式的 testManager 所持有,单例模式的特点 是 其生命周期和 Application 保持一致,因此 Activity 对象无法被及时回收。
解决方法:添加解注册操作
场景三:属性的动画导致的内存泄露
有一种无限循环的属性动画
ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, “rotation”, 0, 360).setDuration(2000);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.start();
如果在Activity onCreate() 播放此类动画且没有在 onDestory() 中去停止动画,那么动画会一直播放下去,尽管已经无法再界面上看到动画了,引起内存泄露
原因:这个时候 Activity 的 View 会被动画持有,而 View 又持有Activity ,最终 Activity 无法释放。
解决方法:在 Activity 的 onDestory() 方法中添加 animator.cancel() 来停止动画
分析工具
卡顿问题– blockCanary 请查看准备☞Android 性能优化☞卡顿问题工具 BlockCanary
内存泄漏问题-LeakCanary 请查看 准备☞Android 性能优化☞ 内存泄露工具 LeakCanary代码检测
review 代码相关(正在更新)