Android之性能优化

来源:互联网 发布:ubuntu wine安装qq 编辑:程序博客网 时间:2024/05/16 19:05
一.布局优化
1、删除布局中无用的控件与层级
2、选择性能较低的布局,比如如果布局既可以使用linearlayout也可以使用relativelayout 那么就采用linearlayout,因为relativelayout的功能比较复杂,他的布局需要更多的cpu时间,framelayout和linearlayout都是比较高效viewgroup,如果单纯的通过framelayout或者framelayout无法实现要显示的产品,而需要通过嵌套的方式来实现的话,那么还是建议使用relativelayout,因为嵌套相当于增加了布局的层级,同样会降低程序的性能。
3、使用include标签,他主要用于布局重用 而merge一般和include搭配使用,用户降低层级,include如果有layout等属性 那么及时merge即使有布局 那么也变成了无效。merge就相当于 将子控件平移到include指定位置的地方
4、viewstub
使用viewstub 是为了减少过度绘制 只有在使用这个view的时候才回去inflate扩充起这个控件
二、绘制优化
是指在view的ondraw方法中 避免执行大量的操作 
1、在onDraw中不要创建新的局部对象 因为onDraw会被频繁的调用 这样就会产生大量临时对象,不仅占用了过多的内存还会导致系统频繁的gc操作
2、onDraw中不要做耗时的操作,因为android系统优化标准,View的绘制帧的频率保持在60fps,这就要求每一帧绘制的时间不超过16ms
三、内存泄漏
1、静态变量导致的内存泄漏
静态变量如果被赋值给一个acitivity 那么会导致这个activity无法正常销毁,或者一个自定义的view被设置为静态变量 由于view强制持有当前的activity,所以也会导致无法有效回收
2、单例模式导致的内存泄漏
例如提供一个单例模式的TestManager,可以接收外部的注册并且将外部的监听器存储起来,如果我们的activity实现了某个接口并且向这个TestManager注册监听,由于缺少解除注册 就会导致activity一直被单例TestManager一直持有。单例的特点是 生命周期和Application保持一致。
3、异步任务在onDestory之前没有销毁


四、ListView或者RecyclerView优化

不能在viewholder中做耗时操作,而且在列表滚动的时候不适合加载数据 ,可以在列表滚动停止之后加载网络图片

布局一定要尽量简化,尽量不要用嵌套的布局

可以使用GPU 渲染检测,防止过度渲染 多一些蓝色 少一些红色

尽量不要设置背景颜色

五、Bitmap 优化

使用BitmapFactory.Option设置inSampleSize的参数


六、线程优化
多使用线程池,,可以重用内部的线程,从而避免了线程的创建和销毁带来的性能开销,同时线程池还能有效地控制线程池的最大并发数,避免大量线程因互相抢占资源从而导致了线程阻塞的发生。
七、其他意见
避免创建过多的对象 任何java类都将占用大约500字节的空间,创建一个类的实例消耗大约15字节的内存
不要过多的使用枚举类型,枚举占用的内存空间比整数要大
常量请使用static final来修饰
多使用SparseArray和pair等,他们有更高的性能
适当使用软引用和弱引用
多使用静态内部类,这样可以避免潜在的内部类而导致的内存泄漏(可以使用mat监测内存泄漏)
多使用静态方法,因为静态方法比普通方法访问速度快15%
减少不必要的成员变量,可以使用android Lint工具检查是否可用一个局部变量代替
对Cursor、Receiver、Sensor、File 等对象要注意对他们的创建、回收、注册、解开注册

使用SurfaceView代替View进行大量、繁琐的绘图操作

给Bitmap进行图片压缩处理
给bitmap包装为软引用或者使用LRU算法缓存
使用leakcarry检查内存泄漏
使用对象池减少对象的开销
避免短时间内创建大量对象 之后又回收,这样容易造成内存抖动
尽量不要用IOC,IOC一般会使用注解+反射来进行加载,会带来性能的下降


0 0