android防止OOM的简单总结
1.在设置图片时的方法
//设置资源图片时,尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。
public static Bitmap readBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//获取资源图片 InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
2、动态回收内存算是最简单的解决方法吧,就是手动的调用System.gc();
bitmap.recycle()方法用于回收该bitmap所占用的内存,用System.gc()调用一下系统的垃圾回收器。
if (bitmap != null && !bitmap .isRecycled()) {
bitmap .recycle();
bitmap = null;
}
System.gc();
3.压缩图片的展示
//压缩,用于节省BITMAP内存空间--解决BUG的关键步骤
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2;//这个的值压缩的倍数(2的整数倍),数值越小,压缩率越小,图片越清晰
//返回原图解码之后的bitmap对象
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.begin_background, opts);
4.在Activity里在结束时一定要关闭现场
(1)总结一下避免Context泄漏应该注意的问题:
(2)尽量使用Application这种Context类型。
(3)注意对Context的引用不要超过它本身的生命周期。
(4)慎重的对Context使用“static”关键字。
(5)Context里如果有线程,一定要在onDestroy()里及时停掉
5.集合的处理
我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
6.android的程序对象
些Android程序可能引用我们的Anroid程序的对象(比如注册机制)。即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄漏的内存依然不能被垃圾回收。调用registerReceiver后未调用unregisterReceiver。
虽然有些系统程序,它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册,程序结束时应该把所有的注册都取消掉