安卓内存泄漏是安卓面试常见的问题,也是安卓内存优化的一个重要途径。内存泄漏的根本原因是因为一个无用的对象继续被其它对象持有,导致该无用对象无法被系统回收,从而产生内存泄漏。具体在开发过程中,有如下几个常见原因:
1.单例模式。单例模式由于其静态特性使得其生命周期非常长,在该单例对象被销毁之前,如果它持有的一个对象没有用处了,仍然被该单例持有,那么如果不手动清除该无用对象,会造成内存泄漏。解决的办法是把上下文设置为application的级别,这样就不会出现内存泄漏的问题。
2.非静态的内部类、匿名类。由于非静态内部类、匿名类会持有外部类的引用,如果我们在外部类定义了一个静态的内部类或者一个匿名类的应用,这样在外部类应该被销毁时,由于被内部类或者匿名类持有而无法被销毁,这样也会造成内存泄漏。解决办法是将内部类封装成静态。
3.handler。如果在子线程使用handler发送消息,当activity被销毁时,如果还有未被处理的消息,那么此时的handler是不会被销毁的,会直到消息处理完毕,所以这样会造成内存泄漏。解决的办法是在activity得 ondestroy方法里面将消息置为null。或者创建一个静态类继承handler,他持有的对象使用弱引用处理,这样也可以防止内存泄漏
4.各类资源使用时未关闭造成的内存泄漏。像常见的数据库未关闭,广播没有反注册,IO流使用完毕没有关闭都不造成内存泄漏。解决办法是在使用完毕之后关闭这些数据。
5.使用ListView。使用listview没有使用缓存策略,即convertView,这样也会造成内存泄漏。解决办法是使用缓存策略。
6.使用集合。在使用集合时,添加元素是一个对象的引用,完毕之后,该集合仍然持有对象的引用导致内存泄漏。解决办法是将集合清空再置空。
7.webview。使用完webview后,如果不销毁该对象也会造成内存泄漏,解决办法,在ondestroy方法里面销毁webview对象。
8.MVP模式。在MVP模式里面,P层要持有V和M层的引用,如果P层在做一些耗时操作,此时的Activity退出,那么也会造成内存泄漏,解决办法,在activity的ondestroy方法里面将P层的view引用置空就行了。