准备☞Android 性能优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ghost_tal/article/details/81941753

Android 性能优化

问题: 内存溢出(内存),卡顿或ANR(CPU)

  1. 布局优化
    首先 删除布局中无用的控件和层级,有选择的使用性能低的ViewGroup,如LinearLayout.
    性能 :布局层级少性能好,
    CPU 花费时间比较:Framelayout = LinearLayout < RelativeLayout
    其次 ,通过采用 < include> 标签,< merge >标签和 ViewStub
    < include > 用于布局重用
    < merge > 一般和< include > 搭配使用,减少布局的层级
    ViewStub 提供按需加载的功能

  2. 绘制优化
    指- View 的 onDraw 方法避免大量操作
    a. onDraw 不要创建新的局部对象,因为 onDraw 会被频繁调用,产生大量临时对象,占用内存,导致频繁gc降低效率
    b. onDraw 方法不要做耗时操作,也不能执行成千上万的循环操作。因为大量的循环抢占CPU的时间片,造成view绘制不流畅。

    添加log监控时间 :
    在函数开始 :long time = System.nanoTime();
    在函数结尾:log.info(“TasteTime:” + (System.nanoTime() - time));

  3. 内存泄漏优化
    内存泄漏-申请的内存不能及时释放,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() 来停止动画

  4. 分析工具
    卡顿问题– blockCanary(正在更新)
    内存泄漏问题-LeakCanary(正在更新)

  5. 代码检测
    review 代码相关(正在更新)

猜你喜欢

转载自blog.csdn.net/Ghost_tal/article/details/81941753