内存泄漏
Q什么是内存泄漏?
内存泄漏memory leak,指原本应该被gc回收的对象还被另一个正在使用的对象引用持有。
Q什么情况下导致内存泄漏?
1.static关键字使用问题
当使用static修饰Context,Activity关闭时不能被回收,因为static修饰的Context生命周期比Activity长。
2.Handler泄漏问题
当使用非静态内部类创建handler时,Activity关闭后handler还在处理消息,将会导致内存泄漏。因为Handler持有Activity的引用。
正确的写法是
创建一个静态Handler内部类,然后对Handler持有的对象使用弱引用,在onDestory移除消息队列中的消息removeCallbacks()
3.资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
Q如何避免内存泄漏?
不要让生命周期长于Activity的对象持有到Activity的引用
尽量使用Application的Context而不是Activity的Context
尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用
静态内部类中使用弱引用来引用外部类的成员变量
参考
http://blog.csdn.net/adreamer_bj/article/details/52099278
http://blog.csdn.net/u010687392/article/details/49909477