手机都有一定的内存限制,比如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.垃圾回收器不是对内存的保险。