要防止泄露Context的悲剧发生,我们有两种手段。我们都比较明了的一个是拒绝让activity类型的context脱离它本身的作用域从而防止像刚才那段代码中展示的无法消除的引用导致的无法垃圾回收。第二种手段是用Application类型的Context对象。这个Context对象会在你的应用存在的时期中一直存在下去——正如它的名字所预示的一样——它不会受activity生命周期的影响。如果你想要保留一个长久存在的需要Context对象的对象,别忘了使用Application Context。你可以简单地通过调用
Context.getApplicationContext()或者 Activity.getApplication()来获得Application Context对象。
避免Context类型的内存泄露,请务必记得如下几条:
1.不要将一个生命周期计划将超过Activity生命周期的对象通过引用保存的方式绑定到一个Activity类型Context上去。如果要绑定,被绑定的对象一定是和该activity拥有相同生命周期的。
2.尝试着在保存长生命周期的对象时用Application Context来代替Activity Context。
3.避免在一个activity中使用一个你没有控制它生命周期的非static的内部类,而是使用static的内部类,然后在里面需要使用context的地方使用外部activity的弱引用(而非方才代码中的强引用)。
4.记住:垃圾回收机制对于内存泄露来说并不是可以迷信的保障。