性能优化

一:卡顿的场景

1、UI绘制2、应用启动3、页面跳转4、事件响应

性能优化

根本原因有两大类:

1界面绘制:层级深,页面复杂,刷新不合理

2数据处理:导致这种卡顿的原因是数据处理量太大,分为三种情况,一是数据处理在UI线程(这种应该避免),二是数据处理占用CPU高,导致主线程拿不到时间片,三是内存增加导致频繁GC,从而引起卡顿。


卡顿检测工具:TraceView检测由数据方面引起的卡顿

手机开发者选项,GPU渲染大概确定页面是否存在卡顿现象,再用Android Lint工具全局扫描工程,找出需要优化的布局,最后用HierarchyView详细检查布局存在的问题。


布局优化:

1、尽量使用RelativeLayout和LinearLayout,在布局层级相同的情况下,尽量使用LinearLayout,因为RelativeLaout会进行两次测量,不如LinearLayout快,用LinearLayout有时候会使布局层级太深,应该尽量使用RelativeLayout。

2、将可复用的组件抽取出来并通过<Include>标签使用

3、使用<ViewStud>标签加载一些不常用的布局

4、使用<merge>标签减少布局的嵌套层次

5、尽可能使用warp_content,warp_content会增加布局mearsure的计算成本,

6、删除控件中的无用属性

注意:

  • <merge />只可以作为xml layout的根节点。
  • 当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。


内存优化

一、内存检测工具 Memory Monitor,Heap Viewer,Allocation Tracker, Memory Analyze Tool(MAT)。


内存泄露的场景:1、资源性对象为关闭,如I/O流,cursor等。

                            2、注册对象未注销;

                            3、类的静态变量持有大数据对象

                            4、非静态内部类的静态实例 解决方案:将非静态内部类改为静态内部类,如果使用Context则尽量使用ApplicationContext;

                            5、Handler临时性内存泄露 解决方案:使用静态Handler内部类,然后对handler持有的对象使用弱引用,在Activity销毁时,移除消息队列中的消息。

private static class NewHandler extends Handler{

    private WeakReference<Context> mContext = null;

    public NewHandler(Context ctx){
        mContext = new WeakReference<Context>(ctx);
    }
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
}

                          6、容器中的对象没有清理造成内存泄漏


内存泄漏监控  LeakCanary