30.3.2防止内存泄露
1 使用Service时,尽量使用IntentService,这样可以避免忘记关闭服务。
2 避免一个对象被比它生命周期长的对象持有或引用,这样会导致该对象无法被释放,内存泄露。
如对一个Activity Context保持长生命周期的引用,即使这个Activity已经被销毁了,但相关内存无法被释放。
对于生命周期长的对象,可以使用ApplicationContext。
非静态内部类的静态实例容易造成内存泄漏,这个静态实例的生命周期超过了类本身:如Activity中的一些特殊Handler等,尽量使用静态类和弱引用来处理。
3 避免代码设计的错误造成内存泄露,如循环引用:A持有B、B持有C、C又持有A。
4 BroadCastReceiver要记得注销处理。
5在Activity的onDestroy方法中调用
handler.removeCallbacksAndMessages(null),取消所有消息的处理,将所有的Callbacks和Messages全部清除掉。
6 在查询SQLite数据库时,会返回一个Cursor,当查询完毕后,及时关闭。
7 I/O流操作完毕,读写结束,记得关闭。
8 线程不再需要继续执行的时候要记得及时关闭。
如在Activity中关联了一个生命周期超过Activity的Thread,在退出Activity时切记结束线程;像HandlerThread的run方法是一个死循环,它不会自己结束,线程的生命周期超过了Activity生命周期,必须手动在Activity的销毁方法中调用thread.getLooper().quit()结束。