Activity context 和 Application context 区别与联系

来源:互联网 发布:tensorflow finetune 编辑:程序博客网 时间:2024/06/05 04:23

声明:转载自:http://blog.csdn.net/qq_27258799

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 {        private static Drawable sBackground;        protected void onCreate(Bundle state) {                super.onCreate(state);                TextView label = new TextView(this);                label.setText("Leaks are bad");                if (sBackground == null) {                        sBackground = getDrawable(R.drawable.large_bitmap);                }        label.setBackgroundDrawable(sBackground);//drawable attached to a view        setContentView(label);        }}

但是看似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 。
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。

0 0
原创粉丝点击