何为内存泄漏?
所谓内存泄漏就是无用的对象得不到释放,依然占用内存空间。
在android中都有哪些情况会出现这种情况呢?
1.某个生命周期长的对象,引用一个生命周期短的对象,生命周期短的已经结束,但是被生命周期长的引用而无法得到释放。包括以下这些情景:
1)我们写的单例引用到activity,activity通过返回进行了destroy,但是由于单例的引用造成内存泄漏。解决方式,使用相同生命周期的对象作为引用。
2)非静态内部类Handler,Handler发送消息后,就会被消息所引用,而handler作为非静态内部类会持有Activity的引用,造成Activity无法释放。解决方法,静态内部类+弱引用。
3)Activity静态变量持有Activity的引用(类似1)),因为静态变量的生命周期要比Activity的生命周期长,所以会长期持有Activity的引用。解决方法,在使用结束后置为null。
4)Thread,AsycTask这两个内部类,因为异步的处理一些事情,生命周期可能会比Activity生命周期要长,最好采用静态内部类+弱引用来处理。
5)Timer, TimerTask这里也会异步的处理一些事情,造成Activity的被引用无法释放。解决方案,在退出Activity的时候cancel掉task。
6)广播及observer在退出activity的时候记得要及时的注销,否则会一直引用Activity。
2. 集合中的对象在使用完后,如果没有机会再使用到它,记得要从集合中remove掉它。
3.IO,Fi le,网络连接,sqlite,cusor使用完后要记得关闭,否则存在buffer中的资源得不到释放。
4. 属性动画,在使用完后记得要调用cancel,否则会一直存在并引用对应的控件,而控件又会引用Activity。
5. Webview使用完,要记得从父view中remove掉,用停用其与Activity的相关联。我们添加Activity后,就会注册相应的callback,而callback会引用到Activity,Android 5.1中注销这部分之前会判断有没有调用webView.destroy(),如果调用过就不会走注销,就会一直引用Activity,这里需要自己手动的将webView从Activity中移除,并解除相关联,并destroy掉它。
在这里我们可以使用StrictMode来检测是否存在内存泄漏,也可以通过分息hprof来确定有没有内存泄漏。