Android性能优化:内存泄漏(只是做个总结笔记)

这个只是为了做个总结笔记,详情请移步到这位大佬的博客:点击这里进入

1、集合类

这个没啥好说的,不再使用的集合,记得要调用clear方法,然后置为null即可。

2、static关键字修饰的成员变量

2.1 原因

static关键字修饰的成员变量,其生命周期==应用程序的生命周期,当其引用了很耗资源的对象(例如:Activity的Context,Bitmap等等)的时候,将导致被引用对象的内存无法被回收,造成内存泄漏。

2.2 解决方法

  • 尽量避免使用static修饰,如果必须使用,要注意适时手动置空;
  • 使用弱引用WeakReference。

3、非静态内部类/匿名类

3.1 原因

非静态内部类/匿名类,默认持有外部类对象,因此导致外部类无法被回收。

3.2 解决方法

  • 非静态内部类设置为->静态内部类;
  • 使用弱引用来保存外部类的对象;

4、线程(Thread、Runnable、AsnycTask)

4.1 原因

和3差不多,都是因为其内部持有外部类的引用。

4.2 解决方法

  • 和3.2差不多,设置为静态内部类;
  • 在外部类的生命周期结束的时候,强制结束线程。

5、Handler

5.1 原因

因为Handler是一个匿名内部类(不要问我为什么,我也不知道为什么。。。。。知道的请告诉我一声。。。谢谢了),因此Handler会持有外部类的引用,而Message里面又会持有Handler的引用(这个得去看Handler、Looper、MessageQueue之间的关系才会知道了),因此,当Message还没有处理完的时候,外部类所占用的内存,是不会被回收的。

5.2 解决方法

  • 自定义一个内部类,继承Handler,用static关键字修饰这个内部类
  • 在自定义的Handler中,用弱引用来保存Activity
  • 在Activity结束以后,清空MessageQueue中所有的消息(Handler.removeMessages(int what);)

6、资源对象使用后未关闭

6.1 原因

  • 对于资源的使用(如 广播BraodcastReceiver、文件流File、数据库游标Cursor、图片资源Bitmap等),若在Activity销毁时无及时关闭 / 注销这些资源,则这些资源将不会被回收,从而造成内存泄漏

6.2 解决方法

  • 在Activity销毁时 及时关闭 / 注销资源
// 对于 广播BraodcastReceiver:注销注册
unregisterReceiver()

// 对于 文件流File:关闭流
InputStream / OutputStream.close()

// 对于数据库游标cursor:使用后关闭游标
cursor.close()

// 对于 图片资源Bitmap:Android分配给图片的内存只有8M,若1个Bitmap对象占内存较多,当它不再被使用时,应调用recycle()回收此对象的像素所占用的内存;最后再赋为null 
Bitmap.recycle();
Bitmap = null;

// 对于动画(属性动画)
// 将动画设置成无限循环播放repeatCount = “infinite”后
// 在Activity退出时记得停止动画

OK,暂时就写这么多了,做一下笔记。

你可能感兴趣的:(笔记,内存泄漏,性能优化)