Android进阶之性能优化

一、性能优化分类

  • 布局优化
  • 绘制优化
  • 内存泄漏优化
  • 响应速度优化
  • ListView优化
  • Bitmap优化
  • 线程优化

二、布局优化

尽量减少布局的嵌套
解决办法:
多嵌套的情况下可以使用RelativeLayout
布局层级相同的情况下使用LinearLayout,它比RelativeLayout更高效
使用标签以及
参考:Android布局优化之标签include,viewstub,merge

三、绘制优化

避免在onDraw中进行大量操作
解决办法:
避免在onDraw中创建新的局部对象,onDraw可能被多次调用,从而产生大量的临时对象 ,导致占用过多的内存,系统频繁gc。
避免在onDraw中进行耗时操作和大量循环操作
参考:Android性能优化:那些不可忽略的绘制优化

四、内存泄漏优化

内存泄漏:内存泄露指的是程序申请了内存以后无法释放
内存溢出:指的是申请内存,内存不足了

1.静态变量导致的内存泄漏
  • 静态变量持有Activity
  • 静态引用应用非静态内部类
    解决办法:
    在onDestroy中使静态变量为null(情况一二都适用)
    创建静态内部类(适用情况二)
    参考:static关键字所导致的内存泄漏问题
2.单例模式导致的内存泄漏

传入单例模式的this使得单例模式持有Activity对象
解决办法:
传入不用this,而用getApplicationContext()

3.属性动画导致的内存泄漏

属性动画有无限播放的动画,如果没有停止会一直播下去
解决办法:
在onDestroy中调用cancel()方法取消播放

4.Handler导致的内存泄漏问题

Message持有Handler的引用,因为Handler作为Activity的内部类会持有外部类的引用,当Activity finish的时候handler依旧会处理message
解决办法:
将Handler设置为静态的,静态内部类不持有外部类引用,并且如果要用到Activity的引用可以传入弱引用

5.线程导致的内存泄漏

AsyncTask或者Runnable定义为匿名内部类,会持有外部类的引用
解决办法:
设置成静态匿名内部类,采用弱引用保存Context对象

6.资源未关闭导致的内存泄漏

BroadcastReceiver,Bitmap,file,Stream,cursor等未关闭
解决办法:
及时关闭资源,BroadcastReceiver用unregisterReceiver,file、cursor,stream用close,Bitmap用recycle关闭

五、响应优化

避免在主线程中做耗时操作

六、ListView优化

复用ViewHolder类

七、Bitmap优化

先利用BitmapFactory.Options的inSampleSize属性,根据需求对图片进行采样后再加载进来。

八、线程优化

使用线程池

你可能感兴趣的:(Android进阶之性能优化)