android防止OOM的简单总结

2019-04-15  本文已影响0人  谜之龙

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。
虽然有些系统程序,它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册,程序结束时应该把所有的注册都取消掉

上一篇下一篇

猜你喜欢

热点阅读