Android避免context相关内存溢出

      手机都有一定的内存限制,比如G1,只有16M的堆内存限制。作为手机开发者,在开发的时候,应该尽可能的节约内存。Android系统内存保存的应用越多,那么用户在使用时程序切换也就越快。其实,很多的内存溢出都有一个共同的特点,那就是,和Context相关的东西长期没有得到释放。

      在Android上,一个Context用于很多操作,最多是用来加载和使用资源。这也是为什么很多widgets 都有一个Context参数的构造方法。Android应用中通常有两种Context,Activity and Application。通常程序员调用类和方法都用到第一个Context.

      请看下面一段代码:

      @Override

 

protected void onCreate(Bundle state) {
  super.onCreate(state);
  
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
  
  setContentView(label);
}

这里意味着views和整个activity都联系在一起了,那么当我们进行横竖屏切换时,默认情况的横竖屏切换会销毁

当前Activity并记住它的状态,然后系统会重新加载Activity至当前状态,如果你的应用里面含有很大的图片的话,那么它会

再次进行加载,这个时候最好的方法,就是使这个量成为一个静态变量:

 

private static Drawable sBackground;
  
@Override
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);
  
  setContentView(label);
}
  这段代码就会比较健壮了,当切换横竖屏的时候,图片就不会重新加载了。
  防止Context相关内存溢出有两个比较简单的方法,一种可以像上面这样,另外一种使用Application的Context.
  总结:
      1.Activity的变量应该和该Activty有一样的生命周期
      2.试着使用Application的Context
      3.避免在Activity中使用非静态类,如果你不控制该类的生命周期的话。可以创建一个静态内部类,并且在
        Activity里使用一些weak reference ,这个观点的解决办法就是在外部类中使用 WeakReference管理        类。
     4.垃圾回收器不是对内存的保险。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值