Activity context 和 Application context 区别与联系

来源:互联网 发布:tom.com 顶级域名 编辑:程序博客网 时间:2024/05/29 17:43

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),所以我们要尽量在每个地方避免内存泄漏问题。

谨记三点:

  1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的。
  2. 对于生命周期长的对象,可以使用application context 。
  3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。


1 0
原创粉丝点击