context大家应该都不陌生,每个Activity的标配,用来加载资源什么的。但是context有两种:Activity context 和 Application context 。一直以来对这两个context都理解不清,这次专门记录下。
Activity context 和 Application context 的区别在于生命周期。
Application context是个好汉(全局变量),与你的程序同生共死。而Activity context 则是个随处可见的墙头草,你的Activity不在了,它就不在了。
值得注意的是Activity context使用不当是会造成内存泄漏的,这里用网友的一段代码解释。比如,当我们旋转屏幕的时候,Activity是会被销毁重建只保存状态信息,里面的资源也会重新抓取。为了不想重新加载图片资源,我选择一个静态变量保存,简直机智!
public class myactivity extends Activity {
}
但是看似OK的代码其实问题很大。由于sBackground是静态的,因此sBackground不会被销毁。而sBackground保存了label的引用,label保存了myactivity 的引用,这一连串联系决定,myactivity 也不能被销魂,这样就引起了内存泄漏。
2016年3月10日补充:
后来在另一家博客上看到“谦虚的天下”讲到,上面这种bug已经在Android3.0以后被官方搞定了,也就是说我们现在在这样使用,也是OK的,原因请看:
http://blog.csdn.net/qq_27258799/article/details/50843554
总之内存泄漏经常很难让用户察觉到,但可怕的是内存泄漏的堆积,久而久之就会出现大名鼎鼎的OOM(Out Of Memory),所以我们要尽量在每个地方避免内存泄漏问题。
谨记三点:
- 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的。
- 对于生命周期长的对象,可以使用application context 。
- 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。