android context引出的问题

接触过android的码农都知道context对象可谓是无所不在啊。那么,什么情况才可能创建context实例呢?有三个地方,第一就是创建 Application对象(唯一) 时、第二就是创建 Activity对象 时、第三就是创建 Service对象 时。
    虽然以上三个地方创建出来的都是context实例,但是在某些情况下,它们就会有质的差别,稍有不慎就会导致著名的“内存泄漏”问题。在这里就简单介绍一下什么叫内存泄漏了。在 Java中, 内存泄漏是指进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却还直接或间接地引用到gc roots, 导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。关于内存泄漏问题留意专题吧。
      context 为什么会造成内存泄漏呢?关键在于,未能清晰辨别application对象创建的context实例与activity或service对象创建的context实例的区别。application是全局性的,而activity或service的生命周期却有可能小于application。如果利用activity的context去保存一些全局性的资源时,那么就有可能造成activity被摧毁时由于资源持有context对象而不能被GC回收。 这个activity对象就是一个无用的但一直占用内存的对象,即无法回收的垃圾对象。所以,对于lauchMode不是singleInstance的Activity, 应该避免在activity里面实例化其非静态内部类的静态实例。例如:
  1. public class MainActivityextends Activity  
  2. {  
  3.          static Demo sInstance = null;  
  4.           
  5.     @Override  
  6.     public void onCreate(BundlesavedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         if (sInstance == null)  
  11.         {  
  12.            sInstance= new Demo();  
  13.         }  
  14.     }  
  15.     class Demo  
  16.     {  
  17.     voiddoSomething()  
  18.     {  
  19.                System.out.print("dosth.");  
  20.     }  
  21.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值